问题:使用cv2.canny 无法提取到手指图像边缘。
解决:
1、查看cv2.canny定义如下:
edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
其中,参数含义如下:
image:要进行边缘检测的输入图像,可以是灰度图像或彩色图像。
threshold1:第一个阈值,用于边缘检测中的滞后阈值,建议取值为100。
threshold2:第二个阈值,用于边缘检测中的滞后阈值,建议取值为200。
edges:可选参数,用于存储边缘检测的结果。如果指定了该参数,则该参数会被用来存储检测到的边缘图像。如果没有指定该参数,则函数会自动创建一个与输入图像相同大小的数组来存储检测到的边缘图像。
apertureSize:可选参数,用于指定Sobel算子的大小,建议取值为3。
L2gradient:可选参数,用于指定是否使用L 2 梯度计算方式。默认值为False,表示使用L1梯度计算方式。
2、我使用的代码如下:
img_canny=cv.Canny(img,100,240)
3、得到的结果如下:
明明很明显的边缘为啥检测的只有一边呢?查看定义后我判断可能是阈值出现了问题。
4、查看图像像素
如上图所示,我发现我的图像分界处的阈值相差不大,甚至整个图像最大的阈值也不过在80左右。于是我猜测是高阈值设置出了问题。
5、重新调整阈值
img_canny=cv.Canny(img,70,80)
经过这次的阈值调整终于得到了想要的结果,结果如下:
值得注意的是阈值设置也不能过低,否则会出现很出不必要的边缘。