2015-07-02 11 views
5

Sto provando ad usare douglas-peucker algoritmo per semplificare la mia collegato components.I mettere le componenti collegati utilizzando bwlabel e inviarlo al douglas algorithm.Here è il link del algoritmo che io sono using- Douglas-Peucker Algorithm matlabLinea Semplificazione elaborazione delle immagini

Ecco il mio code-

clc; 
image=imread('mmm1.jpg'); 
image = im2bw(image); 

[imx imy]=size(image); 
n1=zeros(imx,imy); 
I=zeros(imx,imy); 
L = bwlabel(image,8) ;%Calculating connected components 
[r,c] = find(L==1);  %Using 1st connected component 
n1=zeros(imx,imy); 
rc = [r c]; 

[ps mm]  = dpsimplify(rc,1);   %Douglas-Peucker algorithm 

%To display original component 
%___________________________________________________________________ 
[sx sy]=size(rc); 
for j=1:sx 
    x1=rc(j,1); 
    y1=rc(j,2); 
    n1(x1,y1)=1; 
end 
figure,imshow(n1); 
%___________________________________________________________________ 
%To display component after simplification 
n1=zeros(imx,imy); 
[sx sy]=size(mm); 
for j=1:sx 
    x1=rc(j,1); 
    y1=rc(j,2); 
    n1(x1,y1)=1; 
end 
figure,imshow(n1); 

Questo era il mio ingresso originale immagine- enter image description here

.210

Questa era la mia componente 1st a cui ho applicato Douglas-Peucker Algorithm-

enter image description here

Questo è stato il risultato di Algorithm- enter image description here

Il codice di Douglas-Peucker si possono trovare nel link che ho citato sopra.Così, La mia domanda è perché la semplificazione non sta accadendo per l'intero componente? Come posso risolvere questo?

+0

Immagino perché hai bisogno di punti o linee che descrivono la "linea", non i pixel. Cerca di ottenere prima lo scheletro dell'immagine. https://uk.mathworks.com/help/images/ref/bwmorph.html –

+0

PD: Perché desideri semplificare queste linee? Cosa ti aspetti? Sono semplici come possono ottenere. –

+0

@AnderBiguri Questo perché quando eseguo l'algoritmo di rivelazione degli angoli molte delle linee oblique in questa immagine che non sono abbastanza semplificate danno un risultato errato. Il rilevamento del raster non viene eseguito in queste immagini poiché rileva troppi punti d'angolo. – Noober

risposta

2

Credo che vogliate identificare quanti segmenti di linea retta ci sono nell'immagine. Ho fatto qualcosa di simile al colpo morfologico ed è stato in grado di segmentare queste linee, anche se non in tutta la loro lunghezza.

Ho preparato un elemento di strutturazione della linea verticale (SE), quindi ho creato altri due SE ruotandolo di 60 e 120 gradi attorno al suo centro. Ho eroso l'immagine originale con questi SE e quindi ho ottenuto i componenti collegati.

im = imread('IWVlt.jpg'); 
bw = im2bw(im, graythresh(im)); 

% SEs 
w = 15; 
line = zeros(w); 
line(:, round(w/2)) = 1; 

bw1 = zeros(size(bw)); 

for i = 1:3 
    bw1 = bw1 + imerode(bw, line); 
    line = imrotate(line, 60, 'nearest'); 
end 

[lbl, n] = bwlabel(bw1, 8); 

figure, imshow(bw1) 
figure, imshow(label2rgb(lbl)) 

Come risultato ottengo 25 componenti. Variando w nel codice è possibile minimizzare l'errore.

Per w = 9, che è il valore più basso che è possibile rilevare durante il rilevamento di tutti i segmenti, ottengo 26 componenti. È possibile filtrare componenti troppo piccoli. bonds2

+0

Ciao!Ho creato una chat per noi in modo che possiamo discutere di argomenti relativi a MATLAB che potrebbero essere off-topic o che si estende per un periodo più lungo rispetto a quello che può essere inserito in una casella di commenti. Vieni a trovarci quando hai tempo! http://chat.stackoverflow.com/rooms/81987/matlab – rayryeng