📄 bound2four.m
字号:
function rc_new = bound2four(rc)
%BOUND2FOUR Convert 8-connected boundary to 4-connected boundary.
% RC_NEW = BOUND2FOUR(RC) converts an eight-connected boundary to a
% four-connected boundary. RC is a P-by-2 matrix, each row of
% which contains the row and column coordinates of a boundary
% pixel. BOUND2FOUR inserts new boundary pixels wherever there is
% a diagonal connection.
% Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins
% Digital Image Processing Using MATLAB, Prentice-Hall, 2004
% $Revision: 1.4 $ $Date: 2003/11/21 14:20:21 $
if size(rc, 1) > 1
% Phase 1: remove diagonal turns, one at a time until they are all gone.
done = 0;
rc1 = [rc(end - 1, :); rc];
while ~done
d = diff(rc1, 1);
diagonal_locations = all(d, 2);
double_diagonals = diagonal_locations(1:end - 1) & ...
(diff(diagonal_locations, 1) == 0);
double_diagonal_idx = find(double_diagonals);
turns = any(d(double_diagonal_idx, :) ~= ...
d(double_diagonal_idx + 1, :), 2);
turns_idx = double_diagonal_idx(turns);
if isempty(turns_idx)
done = 1;
else
first_turn = turns_idx(1);
rc1(first_turn + 1, :) = (rc1(first_turn, :) + ...
rc1(first_turn + 2, :)) / 2;
if first_turn == 1
rc1(end, :) = rc1(2, :);
end
end
end
rc1 = rc1(2:end, :);
end
% Phase 2: insert extra pixels where there are diagonal connections.
rowdiff = diff(rc1(:, 1));
coldiff = diff(rc1(:, 2));
diagonal_locations = rowdiff & coldiff;
num_old_pixels = size(rc1, 1);
num_new_pixels = num_old_pixels + sum(diagonal_locations);
rc_new = zeros(num_new_pixels, 2);
% Insert the original values into the proper locations in the new RC
% matrix.
idx = (1:num_old_pixels)' + [0; cumsum(diagonal_locations)];
rc_new(idx, :) = rc1;
% Compute the new pixels to be inserted.
new_pixel_offsets = [0 1; -1 0; 1 0; 0 -1];
offset_codes = 2 * (1 - (coldiff(diagonal_locations) + 1)/2) + ...
(2 - (rowdiff(diagonal_locations) + 1)/2);
new_pixels = rc1(diagonal_locations, :) + ...
new_pixel_offsets(offset_codes, :);
% Where do the new pixels go?
insertion_locations = zeros(num_new_pixels, 1);
insertion_locations(idx) = 1;
insertion_locations = ~insertion_locations;
% Insert the new pixels.
rc_new(insertion_locations, :) = new_pixels;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -