如何为多边形逼近确定cvCanny的最佳参数

hou*_*oft 1 c opencv computer-vision edge-detection feature-detection

这是我的源图像(忽略点,稍后手动添加):

在此输入图像描述

我的目标是获得两只手的粗略多边形近似.像这样的东西:

在此输入图像描述

我对如何做到这一点有一个大概的想法; 我想用来cvCanny找到边缘,cvFindContours找到轮廓,然后cvApproxPoly.

我面临的问题是我不知道如何正确使用cvCanny,特别是我应该使用什么来处理最后3个参数(threshold1&2,apertureSize)?我试过做:

cvCanny(source, cannyProcessedImage, 20, 40, 3);
Run Code Online (Sandbox Code Playgroud)

但结果并不理想.左手看起来相对较好,但右手检测得很少:

在此输入图像描述

一般来说,它不像我想的那么可靠.有没有办法猜测Canny的"最佳"参数,或者至少是一个详细的解释(初学者可以理解)他们做了什么,所以我可以做出有根据的猜测?或者也许有更好的方法来完成这项工作?

Sam*_*Sam 6

看来你必须降低你的门槛.

Canny算法处理滞后阈值:如果至少一个像素与最大阈值一样亮,则选择轮廓,如果它们高于下阈值,则选择所有连接的轮廓像素.

论文建议采用2:1 oe 3:1(例如10和30,或20和60等)的两个阈值.对于某些应用程序,手动和硬编码确定的阈值就足够了.也可能是你的情况.我怀疑如果你降低你的门槛,你会得到很好的结果,因为图像并不复杂.

已经提出了许多自动确定最佳阈值阈值的方法.他们中的大多数依靠梯度幅度来估计最佳阈值.

脚步:

  • 提取渐变(Sobel是一个不错的选择)
  • 你可以将它转换为uchar.渐变的渐变可以具有比255更大的数值,但是没关系.opencv的索贝尔回归了uchars.
  • 制作结果图像的直方图.
  • 将最大阈值设为直方图的第95百分位数,将较低阈值设为最高/ 3.
  • 您应该根据您的应用调整百分位数值,但结果将比硬编码的高和低值更强大

注意: Matlab中实现了一种出色的阈值检测算法.它基于上面的想法,但有点复杂.

注2:如果图像区域之间的轮廓和照明变化不大,则此方法将起作用.如果轮廓在图像的一部分上更清晰,那么您需要局部自适应阈值,这是另一个故事.但看着你的照片,情况应该不是这样.