我正在处理二进制图像以获得其边缘。我使用了opencv中的cannyedge函数,但结果不太理想。
点击查看图片
int edgeThresh = 1;
int lowThreshold = 100;
int const max_lowThreshold = 100;
int ratio = 3;
int kernel_size = 3;
blur(binaryImage, detected_edges, Size(3, 3));
Canny(binaryImage, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size);
dst = Scalar::all(0);
src.copyTo(dst, detected_edges);
imwrite(defaultPath + "edge_" + filename, dst);
我做了一个肮脏的解决方案,它可以工作,但再次增加了处理时间:
Canny(detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size);
blur(detected_edges, detected_edges, Size(3, 3));
Canny(detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size);
我是新的opencv和图像处理,所以很可能我错过了一些东西。
请开导我。谢谢!
first:对于像这样的图像,它只是白色和黑色像素,使用findContours
函数,它会更快,更精确。如果你需要绘制你刚刚发现的轮廓(绘制你的结果),使用drawContours
函数(绘制在新的垫子上,与你发现的轮廓相同的大小)。
关于这个的文档在这里。
其次:这可能是一个问题,您的内核大小或阈值不正确。建议将第二个阈值设置为第一个阈值的3倍。我认为问题可能是你的内核大小(最后一个参数在Canny函数)。尽量不要使用这个函数重载,使用没有这个参数的函数,或者降低内核大小。