рдПрдХ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдо рдирдХреНрдХрд╛рд╢реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

рд╕реАрдо рдирдХреНрдХрд╛рд╢реА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЖрдХрд╛рд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдПрд╕ред рдПрд╡рджрди рдФрд░ рдПред рд╢рдореАрд░ рдХреЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЦрд┐рдВрдЪрд╛рд╡ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЫрд╡рд┐ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрддреНрд╡реЛрдВ рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдиреАрдЪреЗ рджреЛ рддрд╕реНрд╡реАрд░реЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИрдВ - рдореВрд▓ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ 332x480 рд╣реИ, рдЬрдмрдХрд┐ рд╕реАрдо рдирдХреНрдХрд╛рд╢реА'рдУрдо 272x400 рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рддред


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ pseudocode рдФрд░ Matlab рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдореВрд▓ рд▓реЗрдЦ рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ , рдЬреАрдердм рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдбред

рдЫрд╡рд┐ рдКрд░реНрдЬрд╛

рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рдЫрд╡рд┐ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рдПрдХ рддрд╕реНрд╡реАрд░ рдмрдврд╝рд╛рдирд╛ рдПрдХ рд╕рдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдРрд╕реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХрдо рдорд╣рддреНрд╡ рдХрд╛ рд╣реЛ (рдЬрд┐рд╕рдореЗрдВ рдХрдо рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ)ред рд╣рдо рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ "рдКрд░реНрдЬрд╛" рдХрд╛ рдорд╛рдкрдХ рдХрд╣реЗрдВрдЧреЗред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЕрдВрддрд░рд┐рдХреНрд╖ l1 рдореЗрдВ рдЫрд╡рд┐ рдврд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдпрджрд┐ рддрд╕реНрд╡реАрд░ рдореЗрдВ 3 рдЪреИрдирд▓ рд╣реИрдВ, рддреЛ рдкреВрд░реА рдЫрд╡рд┐ рдХреЗ рдврд╛рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЪреИрдирд▓ рдХреЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХреЗ рдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ matlab рдХреЛрдб рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
function res = energyRGB(I) % returns energy of all pixelels % e = |dI/dx| + |dI/dy| res = energyGrey(I(:, :, 1)) + energyGrey(I(:, :, 2)) + energyGrey(I(:, :, 3)); end function res = energyGrey(I) % returns energy of all pixelels % e = |dI/dx| + |dI/dy| res = abs(imfilter(I, [-1,0,1], 'replicate')) + abs(imfilter(I, [-1;0;1], 'replicate')); end 

рдФрд░ рдпрд╣ рдкреНрд░рдпреЛрдЧ рдХреА рдЧрдИ рдЫрд╡рд┐ рдХреЛ рдКрд░реНрдЬрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ:


рд╕реАрд╡рди

рдпрджрд┐ рд╣рдо рдПрдХ рдиреНрдпреВрдирддрдо рдКрд░реНрдЬрд╛ рд▓реЗрдХрд┐рди рдПрдХ рдордирдорд╛рдирд╛ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдкрд┐рдХреНрд╕реЗрд▓ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдЫрд╡рд┐ рджреВрд╖рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреАред рдпрджрд┐ рд╣рдо рдиреНрдпреВрдирддрдо рдКрд░реНрдЬрд╛ рд╡рд╛рд▓реЗ рдХреЙрд▓рдо / рдХреЙрд▓рдо рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЕрд╡рд╛рдВрдЫрд┐рдд рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреАред рдпрд╣рд╛рдБ, рдХреЙрд▓рдо рд╕реЗ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ {(i, j) | j рддрдп рд╣реИ}, рдФрд░ рдХреЙрд▓рдо рдХреЗ рддрд╣рдд {(i, j) | рдореИрдВрдиреЗ рддрдп рдХрд┐рдпрд╛}ред рджреБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╕реНрддрдВрдн / рд╕реНрддрдВрдн рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реИред
рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХ nxm рдЫрд╡рд┐ рд╣реВрдВ, рдлрд┐рд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реАрдо рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ ред
рдЬрд╣рд╛рдБ x: [1, .., n] -> [1, .., m]ред рдпрд╣реА рд╣реИ, рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реАрдо рдЫрд╡рд┐ рдХреЗ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдкрде рдХреА рд▓рдВрдмрд╛рдИ рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╣реИ, рдФрд░ рд╕реАрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ (i, j) рдХреЗ рд▓рд┐рдП, рдЕрдЧрд▓рд╛ рддрддреНрд╡ рдХреЗрд╡рд▓ (i + 1, j-1), (i) рд╣реЛ рд╕рдХрддрд╛ рд╣реИред +1, j), (i + 1, j +1)ред рдЗрд╕реА рддрд░рд╣, рд╣рдо рдХреНрд╖реИрддрд┐рдЬ рд╕реАрдо рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдФрд░ рдХреНрд╖реИрддрд┐рдЬ рд╕реАрдо рдХреЗ рдЙрджрд╛рд╣рд░рдг рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╣реИрдВ:


рд╣рдо рдиреНрдпреВрдирддрдо рдКрд░реНрдЬрд╛ рд╕реАрдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ
рдРрд╕реЗ рд╕реАрдо рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЧрддрд┐рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
  1. рдкреНрд░рддреНрдпреЗрдХ (i, j) рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╡ рд╕реАрдореЛрдВ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдКрд░реНрдЬрд╛ рдХрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ M рдЦреЛрдЬрдирд╛:
    • рдКрд░реНрдЬрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдИ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдПрдо рднрд░реЗрдВ
    • рджреВрд╕рд░реА рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП:
      M [i, j] = e [i, j] + min (M [i - 1, j], M [i, j], M [i +1, j]);

  2. рдореИрдЯреНрд░рд┐рдХреНрд╕ M рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдореЗрдВ рдиреНрдпреВрдирддрдо рдорд╛рди рдЬреНрдЮрд╛рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рддрдХ рдПрдХ рдкрде рдмрдирд╛рдПрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рдиреНрдпреВрдирддрдо рдКрд░реНрдЬрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдЪреБрдиреЗрдВ (рдЗрд╕реА рддрд░рд╣, (i, j), рдкрджреЛрдВ рдореЗрдВ M рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ [i - 1, j], [i] , j], [i + 1, j])ред

рджрдХреНрд╖рддрд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдореИрдЯрд▓реИрдм рдХреЛрдб рдореЗрдВ рдореИрдВ nxm рдмрд┐рдЯ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рд╕реАрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рддреЛ рдЗрд╕реЗ 0 рд▓реЗрдмрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ 1ред
 function [optSeamMask, seamEnergy] = findOptSeam(energy) % finds optimal seam % returns mask with 0 mean a pixel is in the seam % find M for vertical seams % for vertical - use I` M = padarray(energy, [0 1], realmax('double')); % to avoid handling border elements sz = size(M); for i = 2 : sz(1) for j = 2 : (sz(2) - 1) neighbors = [M(i - 1, j - 1) M(i - 1, j) M(i - 1, j + 1)]; M(i, j) = M(i, j) + min(neighbors); end end % find the min element in the last raw [val, indJ] = min(M(sz(1), :)); seamEnergy = val; optSeamMask = zeros(size(energy), 'uint8'); %go backward and save (i, j) for i = sz(1) : -1 : 2 %optSeam(i) = indJ - 1; optSeamMask(i, indJ - 1) = 1; % -1 because of padding on 1 element from left neighbors = [M(i - 1, indJ - 1) M(i - 1, indJ) M(i - 1, indJ + 1)]; [val, indIncr] = min(neighbors); seamEnergy = seamEnergy + val; indJ = indJ + (indIncr - 2); % (x - 2): [1,2]->[-1,1]] end optSeamMask(1, indJ - 1) = 1; % -1 because of padding on 1 element from left optSeamMask = ~optSeamMask; end 

рдХреНрд╖реИрддрд┐рдЬ рд╕реАрдо рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрд╝реНрдб рдПрдирд░реНрдЬреА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдвреВрдВрдврдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрдВрдбрдУрдкреНрд╕рдо рдлрдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВред

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддреЗрдЬреА рд╣рдЯрд╛рдиреЗ рдХреЗ рдЖрджреЗрд╢ рдвреВрдБрдврдирд╛

рддреЛ, рдЕрдм рд╣рдо рдиреНрдпреВрдирддрдо рд╕реАрдо рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЗрд╕реЗ рдЫрд╡рд┐ рд╕реЗ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
 function [optSeamMask, seamEnergy] = findOptSeam(energy) % finds optimal seam % returns mask with 0 mean a pixel is in the seam % find M for vertical seams % for vertical - use I` M = padarray(energy, [0 1], realmax('double')); % to avoid handling border elements sz = size(M); for i = 2 : sz(1) for j = 2 : (sz(2) - 1) neighbors = [M(i - 1, j - 1) M(i - 1, j) M(i - 1, j + 1)]; M(i, j) = M(i, j) + min(neighbors); end end % find the min element in the last raw [val, indJ] = min(M(sz(1), :)); seamEnergy = val; optSeamMask = zeros(size(energy), 'uint8'); %go backward and save (i, j) for i = sz(1) : -1 : 2 %optSeam(i) = indJ - 1; optSeamMask(i, indJ - 1) = 1; % -1 because of padding on 1 element from left neighbors = [M(i - 1, indJ - 1) M(i - 1, indJ) M(i - 1, indJ + 1)]; [val, indIncr] = min(neighbors); seamEnergy = seamEnergy + val; indJ = indJ + (indIncr - 2); % (x - 2): [1,2]->[-1,1]] end optSeamMask(1, indJ - 1) = 1; % -1 because of padding on 1 element from left optSeamMask = ~optSeamMask; end 

рдкрд░рд┐рдЪрд╛рд▓рди рдХрд╛ рдпрд╣ рд╕реЗрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЫрд╡рд┐ рдХреЛ рдЪреМрдбрд╝рд╛рдИ рдпрд╛ рдКрдВрдЪрд╛рдИ рдореЗрдВ рдЖрдХрд╛рд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬрдмрдХрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВ - рдмрд╕ рд╣рдЯрд╛рдПрдВ рдХрд┐ рдХрд┐рддрдиреЗ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реАрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдХ рд╕рд╛рде рдЦрдбрд╝реА рдФрд░ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рдЫрд╡рд┐ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдкреНрд░рддреНрдпреЗрдХ рдЪрд▓рдирд╛ рдкрд░ рдХреИрд╕реЗ рд╕рдордЭреЗрдВ рдХрд┐ рдКрд░реНрдЬрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рдмреЗрд╣рддрд░ рд╣реИ - рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реАрдо рдпрд╛ рдХреНрд╖реИрддрд┐рдЬ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП?
рдбрд╛рдпрдиреЗрдорд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЬреНрдЮрд╛ рджреЗрдирд╛ n 'рдФрд░ m' рд╡рд╛рдВрдЫрд┐рдд рдЫрд╡рд┐ рдЖрдХрд╛рд░ рд╣реИ (n '<n, m' <m)ред рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЯреА рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдФрд░ рдХреНрд╖реИрддрд┐рдЬ рд╕реАрдо рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдЗрд╖реНрдЯрддрдо рдЕрдиреБрдХреНрд░рдо рдХреА рд▓рд╛рдЧрдд рдкреНрд░рддреНрдпреЗрдХ n 'x m' рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЖрд░ = рдПрди - рдПрди ', рдПрдо = рдПрдо - рдПрдо' рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдФрд░ рдХреНрд╖реИрддрд┐рдЬ рд╣рдЯрд╛рдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред T рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЖрдХрд╛рд░ rxc рдХрд╛ рдПрдХ TBM рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ T (i, j) рд╕реНрдЯреЛрд░ 0 рдпрд╛ 1 рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдКрд░реНрдзреНрд╡рд╛рдзрд░ (1) рдпрд╛ рдХреНрд╖реИрддрд┐рдЬ (0) рд╕реАрдо рдХреЛ рд╣рдЯрд╛рдХрд░ T (i, j) рдореЗрдВ рдЖрдП рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЫрджреНрдо рдХреЛрдб рдХреЛ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
  1. рдЯреА (0, 0) = 0;
  2. рд╣рдо рд╕реАрдорд╛ рдкрд░ T рдХреЗ рдорд╛рди рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд░рддреЗ рд╣реИрдВ:
    рд╕рднреА j рдХреЗ рд▓рд┐рдП {
    T (0, j) = T (0, j - 1) + E (рд╕реАрдорд╡рд░реНрдЯрд┐рдХрд▓);
    }
    рд╕рднреА рдХреЗ рд▓рд┐рдП рдореИрдВ {
    T (i, 0) = T (j - 1, 0) + E (рд╕реАрдо рдХреНрд╖реИрддрд┐рдЬ);
    }
  3. рд╣рдо рд╕реАрдорд╛ рдкрд░ TBM рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ:
    рд╕рднреА j {T (0, j) = 1 рдХреЗ рд▓рд┐рдП; }
    рд╕рднреА рдХреЗ рд▓рд┐рдП рдореИрдВ {T (0, i) = 0; }
  4. T рдФрд░ TBM рднрд░реЗрдВ:
    i = 2 рд╕реЗ r {рдХреЗ рд▓рд┐рдП
    imageWithoutRow = рдЫрд╡рд┐;
    j = 2 рд╕реЗ c {рдХреЗ рд▓рд┐рдП
    energy = computeEnergy (imageWithoutRow);

    рд╣реЙрд░рд┐рдЬрд╝реЗрдиреНрд╕реЗрд░рдПрдиреНрдЬрд╝реА = findHor рдХреНрд╖реИрддрд┐рдЬSeamEnergy (energy);
    verticalSeamEnergy = findVerticalSeamEnergy (рдКрд░реНрдЬрд╛);
    tVertical = T (i - 1, j) + verticalSeamEnergy;
    tHor рдХреНрд╖реИрддрд┐рдЬ = T (i, j - 1) _ рдХреНрд╖реИрддрд┐рдЬрд╕рдорд╛рдкрди;
    рдЕрдЧрд░ (tVertical <tHor рдХреНрд╖реИрддрд┐рдЬ) {
    рдЯреА (i, j) = tVertical;
    transBitMask (i, j) = 1
    } {
    T (i, j) = t рдХреНрд╖реИрддрд┐рдЬ;
    transBitMask (i, j) = 0
    }
    // рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдЬрд╛рдПрдВ - рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реАрдо рд╣рдЯрд╛рдПрдВ
    imageWithoutRow = removeVerticalSeam (рдКрд░реНрдЬрд╛);
    }

    energy = computeEnergy (рдЫрд╡рд┐);
    image = removeHor рдХреНрд╖реИрддрд┐рдЬSeam (рдКрд░реНрдЬрд╛);
    }
  5. TBM (i, j) рдХреЗ рдорд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдпрд╛ рд╕реНрддрдВрдн рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реБрдП T (r, c) рд╕реЗ T (1, 1) рддрдХ рдХрд╛ рдорд╛рд░реНрдЧ рдЦреЛрдЬреЗрдВред

рдФрд░ рдорддрд▓рд╛рдм рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
 function [T, transBitMask] = findTransportMatrix(sizeReduction, image) % find optimal order of removing raws and columns T = zeros(sizeReduction(1) + 1, sizeReduction(2) + 1, 'double'); transBitMask = ones(size(T)) * -1; % fill in borders imageNoRow = image; for i = 2 : size(T, 1) energy = energyRGB(imageNoRow); [optSeamMask, seamEnergyRow] = findOptSeam(energy'); imageNoRow = reduceImageByMask(imageNoRow, optSeamMask, 0); transBitMask(i, 1) = 0; T(i, 1) = T(i - 1, 1) + seamEnergyRow; end; imageNoColumn = image; for j = 2 : size(T, 2) energy = energyRGB(imageNoColumn); [optSeamMask, seamEnergyColumn] = findOptSeam(energy); imageNoColumn = reduceImageByMask(imageNoColumn, optSeamMask, 1); transBitMask(1, j) = 1; T(1, j) = T(1, j - 1) + seamEnergyColumn; end; % on the borders, just remove one column and one row before proceeding energy = energyRGB(image); [optSeamMask, seamEnergyRow] = findOptSeam(energy'); image = reduceImageByMask(image, optSeamMask, 0); energy = energyRGB(image); [optSeamMask, seamEnergyColumn] = findOptSeam(energy); image = reduceImageByMask(image, optSeamMask, 1); % fill in internal part for i = 2 : size(T, 1) imageWithoutRow = image; % copy for deleting columns for j = 2 : size(T, 2) energy = energyRGB(imageWithoutRow); [optSeamMaskRow, seamEnergyRow] = findOptSeam(energy'); imageNoRow = reduceImageByMask(imageWithoutRow, optSeamMaskRow, 0); [optSeamMaskColumn, seamEnergyColumn] = findOptSeam(energy); imageNoColumn = reduceImageByMask(imageWithoutRow, optSeamMaskColumn, 1); neighbors = [(T(i - 1, j) + seamEnergyRow) (T(i, j - 1) + seamEnergyColumn)]; [val, ind] = min(neighbors); T(i, j) = val; transBitMask(i, j) = ind - 1; % move from left to right imageWithoutRow = imageNoColumn; end; energy = energyRGB(image); [optSeamMaskRow, seamEnergyRow] = findOptSeam(energy'); % move from top to bottom image = reduceImageByMask(image, optSeamMaskRow, 0); end; end 


рдирд┐рд╖реНрдХрд░реНрд╖

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░рд┐рджреГрд╢реНрдп рдЫрд╡рд┐рдпреЛрдВ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдл рдХреЛ рдпрд╣ рджрд┐рдЦрд╛рддреЗ рд╣реБрдП рджреЗрдЦреЗрдВ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдбрд╛рдпрдиреЗрдорд┐рдХреНрд╕ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдзрдиреНрдпрд╡рд╛рдж рдХреЗ рд▓рд┐рдП):
рдЫрд╡рд┐
рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реИ, рдпрд╣ рд╡рд┐рд╡рд░рдгреЛрдВ рд╕реЗ рднрд░реЗ рдЪрд┐рддреНрд░реЛрдВ рдпрд╛ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИред рдкрд░рд┐рджреГрд╢реНрдп рдЫрд╡рд┐рдпреЛрдВ рдкрд░, рдЖрдХрд╛рд╢ рдпрд╛ рд╕рдореБрджреНрд░ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рдФрд░ рдЫрд╡рд┐, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдирдХреЗ рдХрд╛рд░рдг рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╣рдо рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЫреЛрдЯреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЫрд╡рд┐ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдПрд╡реЗрдбрд╛рди рдФрд░ рдПред рд╢рдореАрд░ рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛, рд╕реАрдо рдирдХреНрдХрд╛рд╢реА рдХреЛ рдЪрд┐рддреНрд░ рддрд╕реНрд╡реАрд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд╕реНрддреБ - рдПрдХ рд╡реНрдпрдХреНрддрд┐ - рдЬрд┐рд╕рдореЗрдВ рд╕реАрдо рдХреА рдирдХреНрдХрд╛рд╢реА рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрдо рдЬрд╛рдирдХрд╛рд░реА рд╣реИ:

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫрд╡рд┐ рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрд╡рд┐рдпрди рдПрдВрдб рдП рд╢рдореАрд░ рд▓реЗрдЦ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):

Source: https://habr.com/ru/post/In183638/


All Articles