diff --git a/chromakey/alpha_gen.m b/chromakey/alpha_gen.m new file mode 100644 index 0000000..07880f2 --- /dev/null +++ b/chromakey/alpha_gen.m @@ -0,0 +1,81 @@ +## Copyright (C) 2020 Jens +## +## This program is free software: you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {} {@var{retval} =} alpha_gen (@var{input1}, @var{input2}) +## +## @seealso{} +## @end deftypefn + +## Author: Jens +## Created: 2020-10-07 + +function a = alpha_gen(N, slope) +s = (0:N-1)/(N-1); +a = to_param(s, 0, 1, 2, -slope, 0.5, 0.5); + +color_bg = [0.1 0.3 0.9]; +color_fg = [0.9 0.9 0.0]; + +mean_fg = mean(color_fg) +norm_fg = norm(color_fg) +mean_bg = mean(color_bg) +norm_bg = norm(color_bg) + +w = N; +h = 8; + +im_a = repmat(a, h, 1); + + +im_comp = to_im (color_fg, a, h) + to_im (color_bg, 1-a, h); +im_fg = to_ref(color_fg, size(im_comp)); +im_bg = to_ref(color_bg, size(im_comp)); + +im_ac = (im_comp - im_bg)./(im_fg - im_bg); + +close all; +figure; +imshow(im_a); title ("im_a") + +figure; +imshow(im_ac); title ("im_ac") + +figure; +imshow(im_comp); title ("im_comp") + +figure; +im_filtered = im_comp - to_ref(color_bg, size(im_comp)); +imshow(im_filtered); title ("im_filtered") + +strip = im_filtered(1,:,:); +strip_clamped = max(0, strip); +strip_clamped_norm = strip_clamped; +n = vecnorm(strip, 2, 3)/norm_fg; +figure; +plot (s, a, s, n); grid; legend("Ground truth", "Calculated") + +endfunction + +function im = to_im(color, a, h) +w = length(a); +im = reshape([color(1)*ones(h,1)*a color(2)*ones(h,1)*a color(3)*ones(h,1)*a], h, w, 3); + +endfunction + +function r = to_ref(ref, d) + r = repmat(reshape(ref,1, 1, 3), d(1), d(2)); +endfunction diff --git a/chromakey/eval_matte.m b/chromakey/eval_matte.m new file mode 100644 index 0000000..0b105f0 --- /dev/null +++ b/chromakey/eval_matte.m @@ -0,0 +1,75 @@ +## Copyright (C) 2020 Jens +## +## This program is free software: you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {} {@var{retval} =} bluescreen (@var{input1}, @var{input2}) +## +## @seealso{} +## @end deftypefn + +## Author: Jens +## Created: 2020-10-03 + +# chromakey('adventure_rose', 20, 10) +# chromakey('cineon_before', 200, 100) + +function eval_matte (prj_name, k_e_matte) + +clip_white_thresh = 0.80; +clip_white_amp = 3; + +clip_black_thresh = 0.20; +clip_black_amp = 3; + +[im_rgb, ref_rgb] = prj_load(prj_name); + +close all; + +pre_filtered = im_rgb - ref_rgb; +pre_filtered_p = max(0,pre_filtered); +pre_filtered_n = -min(0,pre_filtered); + +figure; +imshow(abs(pre_filtered)); title("pre_filtered") + +figure; +filtered_var = var(pre_filtered, 0, 3); + +kn = 1/max(max(filtered_var(:))) +var_n = k_e_matte*kn*filtered_var; +matte = min(1, var_n); +imshow(matte); title("var") + +figure; +filtered_norm = vecnorm(pre_filtered, 2, 3); +imshow(filtered_norm); title("norm") + +figure; +intermediate = im_rgb.*matte; +imshow(intermediate); title("intermediate") + +figure; +edges = exp(-1.7*k_e_matte*var(intermediate - ref_rgb, 0, 3)); +imshow(edges); title("edges") + +figure; +final = intermediate - edges.*ref_rgb; +imshow(final); title("final") + +imwrite(intermediate, sprintf('%s.intermediate.png',prj_name),'png','alpha', matte); +imwrite(edges, sprintf('%s.edges.png',prj_name),'png'); +imwrite(final, sprintf('%s.final.png',prj_name),'png','alpha', matte); + diff --git a/chromakey/to_param.m b/chromakey/to_param.m new file mode 100644 index 0000000..e773cf5 --- /dev/null +++ b/chromakey/to_param.m @@ -0,0 +1,59 @@ +## Copyright (C) 2020 Jens +## +## This program is free software: you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {} {@var{retval} =} to_param (@var{input1}, @var{input2}) +## +## @seealso{} +## @end deftypefn + +## Author: Jens +## Created: 2020-10-07 + +function p = to_param(x, pmin, pmax, B, k, pcenter, scenter) + + if (pmin == pmax) + pmax += 1E-9; + end + + if (k == 0) + k = 1E-9; + end + + if ((pcenter < pmin) || (pcenter > pmax)) + pcenter = pmax*scenter + pmin*(1-scenter); + end + + x = min(1, max(0, x)); + kc = 1/(B^k-1); + p = []; + for n=1:length(x); + s = x(n); + if (s < scenter) + s = (scenter-s)/scenter; + ks = -(pcenter-pmin); + else + s = (-scenter+s)/(1-scenter); + ks = (pmax-pcenter); + end + if (B == 1) + p = [p pcenter + ks*kc*s]; + else + p = [p pcenter + ks*kc*(B.^(k*s)-1)]; + end + end +endfunction +