Un approccio diverso è quello di utilizzare il fatto che tutte le linee che descrivono i legami hanno lo stesso rapporto di aspetto e area. dopo aver filtrato l'immagine lasciandola solo con i legami, possiamo osservare l'orientamento o l'elenco degli indici che li compongono per rilevare se sono verticali o quant'altro. Tutto questo può essere fatto usando 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)
Controllo dell'istogramma mostra dove tagliare per le linee, le linee hanno aree più piccole rispetto alle lettere, e dovrebbero avere approssimativamente la stessa superficie. Così ho tagliato per le aree sotto i 1000 pixel:
idx=find(areas<1000);
angs=round([stat(idx).Orientation]);
Ora è possibile utilizzare il angs
e idx
per ottenere che mai tipo di linea che si desidera. Per esempio consente solo tracciare le linee di 30 gradi:
d2=zeros(size(d));
d2(vertcat(stat(idx(angs==30)).PixelIdxList))=1;
imagesc(d2)
Si noti che al momento ho iniziato a rispondere a questa domanda l'immagine che ho preso era il file benzene.png. Ora mi rendo conto che hai fornito un'immagine diversa da quella originale, in modo tale che le linee che raffigurano i legami non siano separate, piuttosto che tu abbia "anelli". Vedrò più tardi se potrò occuparmi anche di questo se vuoi che lo faccia.
EDIT:
trovare la linea rilevante per la nuova immagine, in cui si dispone di anelli, l'unica differenza le linee hanno è che, beh, sono "linee" rette e non curvo. Così ho ricorrere al amata Hough transform a raccoglierli:
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);
Diamo ottenere gli angoli delle linee rilevate:
angs=round([lines.theta]);
vedrai che qui angs
genererà valori di 0, -60 o 60 gradi.
che vogliate tracciare solo quelli che sono a 0 gradi:
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
può fare un collegamento on-line a questa immagine? Non riesco a trovarlo sulla rete – roni
Ho risolto la mia domanda. Ho capito il mio errore, ma ora sto ottenendo di nuovo un risultato inaspettato. – Noober
@roni Puoi salvare questa immagine da qui come non ho il link all'immagine ora. – Noober