7

Cuando uso el algoritmo canny edge, produce los 2 bordes opuestos a la línea de color grueso como se esperaba, pero solo quiero mostrar un borde para detectar mi línea y curva Algoritmo mucho menos complicado, ¿alguna idea sobre cómo puedo lograrlo?Necesita solo un borde en el algoritmo de canto de Canny

enter image description here

Aquí está el código:

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; 

} 

Ésta no es la imagen original, pero similar:

enter image description here

¿Qué parte comento hacia fuera a ser capaz de leer imágenes negras en fondos blancos? o cualquier imagen coloreada?

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

¿Qué ha intentado hasta ahora? ¿Puedes publicar algún código? O al menos la imagen de entrada? – dom

+0

¿Puedes subir un enlace a tu imagen original? Puede ser que otras personas puedan proporcionar mejores métodos. –

+0

El método tonto y simple para hacerlo es cambiar el tamaño de la imagen, hágalo lo suficientemente pequeño como para que los bordes sean de 1 a 2 píxeles. Tendrás bordes astutos de 1 píxel y un aumento de rendimiento instantáneo. – Sam

Respuesta

2

Ese proceso se llama skeletonization o thinning. Puedes google para eso.

Aquí es una simple method for skeletonization: skeletonization OpenCV In C#

A continuación se muestra la output llegué cuando se aplica el método anterior a su imagen (imagen se invierte antes de esqueletización porque por encima de trabajo método para white images in black background, solo caso contrario su imagen de entrada) .

enter image description here

+0

Esto se ve muy útil, ¿por qué no se prefiere la esqueletización a cana en el procesamiento de imágenes? (Estoy asumiendo esto porque no he oído nada de esto) –

+0

No estoy seguro, pero la detección de bordes astutos se usa comúnmente, y también la esqueletización sigue siendo un enfoque en desarrollo, se están preparando más métodos día a día (el enfoque en mi respuesta no es tan bueno). De cualquier forma, no he utilizado la esqueletización todavía. –

+0

¡eso es impresionante! pero, ¿funcionaría si no supieras el color de la imagen o el fondo? –

Cuestiones relacionadas