www.pudn.com > Ms_segmenter.rar > Svd_dist_reg.m
function [Svd_dist_bdry, Svd_dist_reg] = Svd_dist (Region1, Region2) % first represent the two boundaries as matrices where ones stand for % boundary pixels and zeros elsewhere, next use SVD decomposition to % find eigenvalues, and finally adjust those (take shorter array and % multiply it by the lengths ratio) - observed from resizing the same % image Subints = 8; if length(Region1.Boundary) < length(Region2.Boundary) % rotate 1 is quicker Temp = Region1; Region1 = Region2; Region2 = Temp; end % finding the first region boundary and filled Max_x1 = Region1.Shifts(1, 2); Min_x1 = Region1.Shifts(1, 1); Max_y1 = Region1.Shifts(2, 2); Min_y1 = Region1.Shifts(2, 1); Mb1 = zeros(Max_x1-Min_x1+1, Max_y1-Min_y1+1); Mb1(sub2ind(size(Mb1), Region1.Boundary(1, :)-Min_x1+1, ... Region1.Boundary(2, :)-Min_y1+1)) = 1; Bdry_diag1 = svd(Mb1); To_start_fill = [Region1.Inner_pts(2, :)-Min_y1+1; ... Region1.Inner_pts(1, :)-Min_x1+1]; Mb1 = bwfill(Mb1, To_start_fill(1, :), To_start_fill(2, :)); % global Mb1f; % Mb1f = Mb1; % global Mb2f; Reg_diag1 = svd(double(Mb1)); Ld1 = length(Reg_diag1); [Rows1, Cols1] = size(Mb1); % finding the second region filled Max_x2 = Region2.Shifts(1, 2); Min_x2 = Region2.Shifts(1, 1); Max_y2 = Region2.Shifts(2, 2); Min_y2 = Region2.Shifts(2, 1); Mb2_orig = zeros(Max_x2-Min_x2+1, Max_y2-Min_y2+1); Mb2_orig(sub2ind(size(Mb2_orig), Region2.Boundary(1, :)-Min_x2+1, ... Region2.Boundary(2, :)-Min_y2+1)) = 1; To_start_fill = [Region2.Inner_pts(2, :)-Min_y2+1; ... Region2.Inner_pts(1, :)-Min_x2+1]; Mb2_orig = bwfill(Mb2_orig, To_start_fill(1, :), To_start_fill(2, :)); % Mb2f = Mb2_orig; [Rows, Cols] = find(Mb2_orig); Mb2_orig = [Rows'; Cols']; for i=1:Subints+1 % obtaining rotated second filled and extracting boundary next Theta = (i-1)*(pi/2)/(Subints+1); Matrix = [cos(Theta), sin(Theta); -sin(Theta), cos(Theta)]; Mb2_ind = Matrix * Mb2_orig; Mb2_ind = [round(Mb2_ind), floor(Mb2_ind), ceil(Mb2_ind)]; Max_x2 = max(Mb2_ind(1, :)); Min_x2 = min(Mb2_ind(1, :)); Max_y2 = max(Mb2_ind(2, :)); Min_y2 = min(Mb2_ind(2, :)); Mb2 = zeros(Max_x2-Min_x2+1, Max_y2-Min_y2+1); Mb2(sub2ind(size(Mb2), Mb2_ind(1, :)-Min_x2+1, Mb2_ind(2, :)-Min_y2+1)) = 1; Reg_diag2 = svd(Mb2); Ld2 = length(Reg_diag2); Mb2 = double(bwperim(Mb2)); Bdry_diag2 = svd(Mb2); [Rows2, Cols2] = size(Mb2); if Ld1 > Ld2 Bdry_diag_1 = Bdry_diag1(1:Ld2); Reg_diag_1 = Reg_diag1(1:Ld2); else Bdry_diag_1 = Bdry_diag1; Reg_diag_1 = Reg_diag1; Bdry_diag2 = Bdry_diag2(1:Ld1); Reg_diag2 = Reg_diag2(1:Ld1); end Factor = sqrt((Rows1*Cols1)/(Rows2*Cols2)); if Factor > 1 Bdry_diag2 = Bdry_diag2*Factor; Reg_diag2 = Reg_diag2*Factor; else Bdry_diag1 = Bdry_diag1/Factor; Reg_diag1 = Reg_diag1/Factor; end Svd_dist_bdry(i) = norm(Bdry_diag_1-Bdry_diag2); Svd_dist_reg(i) = norm(Reg_diag_1-Reg_diag2); end Svd_dist_bdry = min(Svd_dist_bdry); Svd_dist_reg = min(Svd_dist_reg);