Другой подход заключается в использовании того факта, что все линии, изображающие связи, имеют одинаковое соотношение сторон и площадь. после фильтрации изображения, оставив в нем только связи, мы можем посмотреть на ориентацию или на список индексов, которые их составляют, чтобы определить, являются ли они вертикальными или что-то еще. Все это можно сделать с помощью regionprops
.
image=rgb2gray(imread('benzene.png'));
d=abs(255-image); % inverse the image
d=im2bw(d);
stat=regionprops(d,'Area', 'Orientation','PixelIdxList');
areas=[stat.Area];
hist(areas)
![введите здесь описание изображения](https://i.stack.imgur.com/dQHlp.png)
Просмотр гистограммы показывает, где нужно обрезать линии, линии имеют меньшую площадь, чем буквы, и они должны иметь примерно одинаковую площадь. Поэтому я обрезал области ниже 1000 пикселей:
idx=find(areas<1000);
angs=round([stat(idx).Orientation]);
теперь вы можете использовать angs
и idx
, чтобы получить нужный тип строки. Например, давайте просто построим 30-градусные линии:
d2=zeros(size(d));
d2(vertcat(stat(idx(angs==30)).PixelIdxList))=1;
imagesc(d2)
![введите здесь описание изображения](https://i.stack.imgur.com/X5M67.png)
Обратите внимание, что в то время, когда я начал отвечать на этот вопрос, изображение, которое я сделал, было файлом benzene.png. Теперь я понимаю, что вы предоставили изображение, отличное от исходного, так что линии, изображающие связи, не являются отдельными, а у вас есть «кольца». Я посмотрю позже, смогу ли я решить и это, если вы хотите.
ИЗМЕНИТЬ:
Чтобы найти соответствующую линию для нового изображения, где у вас есть кольца, единственное отличие линий состоит в том, что они прямые, а не изогнутые. Поэтому я прибегаю к любимому преобразованию Хафа, чтобы подобрать их:
image=imread('http://i.stack.imgur.com/bdNOt.png');
d=abs(1-image); % inverse the image
BW=im2bw(d);
BW = bwmorph(BW,'skel',1);
[H, T, R] = hough(BW,'Theta',-90:10:80);
P = houghpeaks(H, 100,'NHoodSize',[3 3],'threshold',1);
lines = houghlines(BW, T, R, P, 'FillGap',5, 'MinLength', 35);
Получим углы обнаруженных линий:
angs=round([lines.theta]);
вы увидите, что здесь angs
будет генерировать значения 0, -60 или 60 градусов.
скажем, вы хотите построить только те, которые равны 0 градусов:
p1=vertcat(lines(angs==0).point1);
p2=vertcat(lines(angs==0).point2);
imshow(BW, 'InitialMag',200, 'Border','tight'), hold on
for k = 1:size(p1,1)
line([p1(k,1) p2(k,1)],[p1(k,2) p2(k,2)], 'LineWidth',4,...
'Color',[1 0 0]); hold on
end
hold off
![введите здесь описание изображения](https://i.stack.imgur.com/ts5Uh.png)
person
bla
schedule
19.06.2015