Предполагая, что ваше изображение BW
ниже:
% detecting all connected regions:
B = bwboundaries(BW,4);
Это приводит к массиву ячеек B
, который содержит все «заплатки», которые создаются путем соединения соседних ячеек со значением 1
, которые соединены с одной из 4 сторон, то есть не по диагонали.
B =
[11x2 double]
[ 2x2 double]
[ 3x2 double]
[ 3x2 double]
[ 2x2 double]
[ 3x2 double]
[ 2x2 double]
[ 2x2 double]
[ 3x2 double]
[ 3x2 double]
[ 2x2 double]
[11x2 double]
Например:
>> B{6}
ans =
3 7
3 8
3 7
Каждая строка представляет собой координаты одной ячейки. Первый столбец - это его строка, второй - его столбец, а первая и последняя ячейки всегда одинаковы.
Теперь нам нужно пройтись по ячейкам в B
и найти, какие из них являются линиями, горизонтальными или вертикальными, и сохранить их в новых матрицах.
% matrices for horizontal and vertical lines:
BWh = zeros(size(BW)); % horizontal lines
BWv = zeros(size(BW)); % vertical lines
for k = 1:numel(B)
% if the coordinates changes ONLY vertically:
% a vertical line is where all the coulmn indecies are the same
% and there are different row indices
if all(B{k}(1,2)==B{k}(:,2)) && B{k}(1,1)~=B{k}(2,1)
BWv(sub2ind(size(BW),B{k}(:,1),B{k}(:,2))) = 1;
end
% if the coordinates changes ONLY horizontaly:
% a vertical line is where all the row indecies are the same
% and there are different column indices
if all(B{k}(1,1)==B{k}(:,1)) && B{k}(1,2)~=B{k}(2,2)
BWh(sub2ind(size(BW),B{k}(:,1),B{k}(:,2))) = 1;
end
end
subplot 131
imagesc(BWh)
title('Horizontal lines')
subplot 132
imagesc(BWv)
title('Vertical lines')
«Диагональные края» - это то, что осталось после того, как мы исключили линии, поэтому мы можем просто поискать то, что мы пока не нашли:
subplot 133
imagesc(BW & ~BWv & ~BWh)
title('Diagonal edges')
colormap 'gray'
Этот метод игнорирует все, что не является толстой линией в одну ячейку, поэтому, например, квадрат в середине на изображении ниже будет отображаться только в шаблоне Диагональные края:
person
EBH
schedule
12.02.2017