我正在研究二进制图像以获得优势。我使用了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和图像处理的新手,所以我很可能错过了一些东西。
请赐教。谢谢!
答案 0 :(得分:0)
首先:对于像这样的图像,只有白色和黑色像素,使用findContours
功能,它会更快,更精确。如果您需要绘制刚刚找到的轮廓(绘制结果),请使用drawContours
函数(在新Mat上绘制,与您在轮廓上找到的轮廓相同)。
有关此HERE的文档。
第二次:您的内核大小或阈值值不正确可能是个问题。第二个阈值被推荐为第一个阈值的3倍。我认为问题可能在于你的内核大小(Canny函数中的最后一个参数)。尽量不要使用此函数重载,使用不带此参数的那个或降低内核大小。