Ein anderer Ansatz ist die Tatsache nutzen dass alle Linien, die Anleihen darstellen, haben das gleiche Seitenverhältnis und die gleiche Fläche. Nach dem Filtern des Bildes mit nur den Bindungen können wir die Orientierung oder die Liste der Indizes betrachten, die sie bilden, um zu erkennen, ob sie vertikal sind oder nicht. All dies kann mit regionprops
durchgeführt werden.
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)
das Histogramm Inspizieren zeigt, wo für die Linien zu schneiden, die Linien haben kleinere Bereiche als die Buchstaben, und sie sollten etwa die gleiche Fläche haben. Also schnitt ich für Flächen unter 1000 Punkte:
idx=find(areas<1000);
angs=round([stat(idx).Orientation]);
jetzt können Sie die angs
und idx
bekommen verwenden, die jemals Art der Linie, die Sie wollen. Zum Beispiel lässt nur die 30-Grad-Linien zeichnen:
d2=zeros(size(d));
d2(vertcat(stat(idx(angs==30)).PixelIdxList))=1;
imagesc(d2)
Beachten Sie, dass ich zu der Zeit begonnen, diese Frage zu beantworten, das Bild habe ich die benzene.png Datei war. Jetzt erkenne ich, dass Sie ein anderes Bild als das ursprüngliche zur Verfügung gestellt haben, so dass die Linien, die Bindungen darstellen, nicht getrennt sind, sondern Sie haben "Ringe". Ich werde später sehen, ob ich das auch ansprechen kann, wenn du willst.
EDIT:
Um die entsprechende Zeile für das neue Bild, wo Sie Ringe haben, der einzige Unterschied die Linien ist, dass, na ja, sie gerade „Linien“ und nicht gekrümmt sind. So greifen ich an die Geliebte Hough transform, um sie abzuholen:
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);
Lassen Sie uns die Winkel der gefundenen Linien erhalten:
angs=round([lines.theta]);
Sie werden sehen, dass hier angs
Werte von 0 erzeugen, -60 oder 60 Grad.
sagen Sie nur diejenigen darstellen möchten, die 0 Grad sind:
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
können Sie eine Online-Verbindung zu diesem Bild geben? Ich kann es nicht im Netz finden – roni
Ich habe meine Frage bearbeitet. Ich habe meinen Fehler verstanden, aber jetzt bekomme ich wieder unerwartete Ergebnisse. – Noober
@roni Sie können dieses Bild von hier selbst speichern, da ich jetzt keinen Link zum Bild habe. – Noober