當我使用Canny邊緣算法時,它會像預期的那樣產生與粗綵線相對的2條邊線,但我只想顯示一條邊線,以便進行線條和曲線檢測算法複雜得多,關於如何使這種情況發生的任何想法?在Canny邊緣算法中只需要一條邊線
下面是代碼:
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;
}
這不是原始圖像,但類似:
我該註釋的部分分離出來,能夠閱讀黑色的圖像在白色背景?或任何彩色圖像?
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);
你到目前爲止試過了什麼?你可以發佈一些代碼嗎?或者至少是輸入圖像? – dom 2012-07-15 14:09:50
你可以上傳一個鏈接到你的原始圖像?可能是其他人可以提供更好的方法。 – 2012-07-15 14:22:24
最簡單的方法就是調整圖像的大小 - 使其足夠小,邊緣將爲1-2像素。您將擁有1像素Canny邊緣和即時性能提升。 – Sam 2012-07-16 07:49:32