7

Quando utilizzo l'algoritmo di bordo canny, produce i 2 bordi opposti alla linea colorata spessa come previsto, ma voglio che venga visualizzato un solo bordo in modo da rendere il rilevamento della linea e della curva algoritmo molto meno complicato, qualche idea su come posso farlo accadere?È necessario un solo arco nell'algoritmo Canny edge

enter image description here

Ecco il codice:

bool CannyEdgeDetection(DataStructure& col) 
{ 

Mat src, src_gray; 
Mat dst, detected_edges, fin; 
int WhiteCount = 0, BCount = 0; 

char szFil1[32] = "ocv.bmp"; 
char szFil2[32] = "dst.bmp"; 
src = imread(szFil1); 
dst = imread(szFil1); 
blur(src_gray, detected_edges, Size(3,3)); 
Canny(src, dst, 100, 200, 3); 
imwrite(szFil2, dst); 

IplImage* img = cvLoadImage(szFil2); 
int height = img->height; 
int width  = img->width; 
int step  = img->widthStep; 
int channels = img->nChannels; 
uchar * datau  = (uchar *)img->imageData; 

for(int i=0;i<height;i++){ 
for(int j=0;j<width;j++){ 
for(int k=0;k<channels;k++){ 
datau[i*step+j*channels+k] = 255 - datau[i*step+j*channels+k]; 
if (datau[i*step+j*channels+k]==0){ 
WhiteCount++; 
col.pixel_col [i][j] = 2; 
} 
else{BCount++; 
col.pixel_col[i][j] = 0; 
} 
} 
} 
} 

cvSaveImage("img.bmp" ,img); 

return 0; 

} 

Questo non è l'immagine originale, ma simile:

enter image description here

Quale parte faccio a commentare fuori per essere in grado di leggere immagini nere su sfondi bianchi? o qualsiasi immagine colorata?

bool done; 
do 
{ 
    cv::morphologyEx(img, temp, cv::MORPH_OPEN, element); 
    cv::bitwise_not(temp, temp); 
    cv::bitwise_and(img, temp, temp); 
    cv::bitwise_or(skel, temp, skel); 
    cv::erode(img, img, element); 

    double max; 
    cv::minMaxLoc(img, 0, &max); 
    done = (max == 0); 
} while (!done); 
+0

Cosa hai provato fino ad ora? Puoi pubblicare del codice? O almeno l'immagine di input? – dom

+0

puoi caricare un link alla tua immagine originale? Possono essere altre persone in grado di fornire metodi migliori. –

+0

Il semplice metodo per farlo è ridimensionare l'immagine - renderla abbastanza piccola da far sì che i bordi siano 1-2 pixel. Avrai sia bordi canny da 1 pixel che un incremento istantaneo delle prestazioni. – Sam

risposta

2

Questo processo è chiamato skeletonization o thinning. Puoi google per quello.

Ecco un simple method for skeletonization: skeletonization OpenCV In C#

riportano di seguito le output ho avuto quando applicato sopra metodo per la vostra immagine (immagine è invertita prima Scheletrizzazione perché al di sopra di lavoro metodo per white images in black background, proprio caso opposto della vostra immagine in ingresso) .

enter image description here

+0

Questo sembra davvero utile, perché la scheletrizzazione non è preferibile all'elaborazione dell'immagine (sto assumendo questo perché non ne ho mai sentito parlare) –

+0

Non ne sono sicuro, ma viene comunemente utilizzato il rilevamento del margine canny e anche la scheletrizzazione è ancora un approccio in via di sviluppo, più metodi vengono preparati giorno dopo giorno (l'approccio nella mia risposta non è così buono). In ogni caso, non ho ancora usato la scheletrizzazione. –

+0

è impressionante! ma funzionerebbe se non conoscessi il colore dell'immagine o dello sfondo? –

Problemi correlati