7

Kanatlı kenar algoritmasını kullandığımda, beklendiği gibi kalın renkli çizginin karşısındaki 2 kenarı üretir, ancak çizgimi ve eğri algılamayı yapmak için yalnızca bir kenarın görüntülenmesini istiyorum algoritma çok daha az karmaşık, bunun nasıl gerçekleşebileceğine dair herhangi bir fikir var mı?Canny kenar algoritmasında yalnızca bir kenara mı ihtiyacınız var?

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; 

} 

Bu orijinal görüntü ama benzer değil: İşte

enter image description here

kodudur

enter image description here

i okuyabilecek olduğu ortaya yorum yaparım Hangi parçası beyaz arka planda siyah görüntüler? veya herhangi bir renkli görüntü mü?

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

o ana kadar denedim ne olacak? Bir kod gönderebilir misin? Ya da en azından giriş görüntüsü? – dom

+0

Orijinal resminize bir bağlantı yükleyebilir misiniz? Başka insanlar daha iyi yöntemler sağlayabilir. –

+0

Bunu yapmanın aptalca basit yöntemi, görüntüyü yeniden boyutlandırmaktır - kenarların 1-2 piksel olacağı kadar küçük olmasını sağlayın. Hem 1 piksel dalga kenarları hem de anında performans artışı olacak. – Sam

cevap

2

süreç skeletonization veya thinning denir Yani. Bunun için google olabilir. İşte

bir simple method for skeletonization geçerli: skeletonization OpenCV In C# Aşağıda

resminize yöntemle yukarıda uygulandığında aldığım output olduğunu (Görüntü önce ters çevrilir iskeletleştirme çünkü white images in black background için yukarıdaki yöntem çalışması, senin giriş görüntüsünün tam tersi durum) .

enter image description here

+0

Bu gerçekten yararlı görünüyor, neden iskeletleme görüntü işleme canny tercih etti (Ben bunu hiç duymadım çünkü ben varsayım) –

+0

Bu konuda emin değilim, ama canny kenar algılama yaygın olarak kullanılır, ve Ayrıca iskeletlenme hala gelişmekte olan bir yaklaşımdır, her geçen gün daha fazla yöntem hazırlanmaktadır (cevabımdaki yaklaşım çok iyi değildir). Daha önce hiç iskeletleme yapmadım. –

+0

bu etkileyici! Görüntünün veya arkaplanın rengini bilmiyorsanız işe yarayacak mı? –

İlgili konular