Canny边缘图像 - 去噪

10
我有一个使用Canny边缘检测算法处理的球的图片(见下面的链接),其中包含许多噪点边缘。有哪些最佳的图像处理技术可以用来去除这些噪点边缘而不会删除属于球的边缘?
原始图片: original Canny边缘检测图片: canny 非常感谢大家提前帮助和建议,非常感激! P.S. 我正在尝试在使用Circle Hough变换检测球之前清理边缘图像。

能够看到原始图像会很有用。Canny边缘检测器有三个输入参数,其中之一是用于预处理的高斯模糊滤波器的大小,另外两个是控制返回细节级别的阈值。我怀疑您可以通过更合适的选择来改善结果,但需要原始图像才能确定。 - Roger Rowland
我正在按以下方式自动计算Canny参数:double high_thres = cv :: threshold(orig_img,thres_img,0,255,CV_THRESH_BINARY + CV_THRESH_OTSU);lower thres = 0.1 * high_threscv :: Canny(orig_img,cannyOP,lower_thres,high_thres);如果我将“lower_thres”设置为0.1的倍数以下,则会产生太多噪音;如果我将其设置得更高,则会丢失属于球的边缘。此内容摘自:https://dev59.com/X2855IYBdhLWcg3whExL - Adam
好的,那么你能提供原始图片的链接吗?(我会将其添加到你的问题中) - Roger Rowland
这取决于图像的情况;-) 其他的选择可能是使用颜色分割和均值漂移或光流进行跟踪,或者如果你有球的真实图像,也可以尝试模板匹配。让我们先看看图像的样子,我会等待你的更新。 - Roger Rowland
我正在尝试检测和跟踪任意颜色的球,无论光照水平如何,仅使用灰度图像。稍后我会发布图片。非常感谢您的建议 :) - Adam
显示剩余4条评论
3个回答

10
最好的选择是在应用边缘检测器之前对图像进行滤波。为了保持锐利的边缘,您需要使用比高斯模糊更复杂的滤波器。
两个简单的选项是双边滤波器引导滤波器。这两个滤波器非常容易实现,并且它们在大多数情况下都提供良好的结果:去除高斯噪声并保留边缘。如果您需要更强大的功能,则可以尝试BM3D滤波器,它是最先进的滤波器之一,并且您可以在此处找到开源实现。

9

只有在您设置最佳阈值级别(较低和较高阈值)之后,Canny边缘检测才能起到最佳效果

如何设置它们?

  • 首先,计算灰度图像的中位数
  • 使用图像的中位数选择最佳阈值。

以下伪代码向您展示了如何操作:

v = np.median(gray_img)
sigma = 0.33

#---- apply optimal Canny edge detection using the computed median----
lower_thresh = int(max(0, (1.0 - sigma) * v))
upper_thresh = int(min(255, (1.0 + sigma) * v))

设置lower_threshupper_thresh作为canny边缘函数的参数。 sigma设置为0.33,因为在统计学中,分布曲线上处于起点和终点的33%之间的值被认为是正常值,超出和低于这个范围的值被视为异常值。
以下是您的图像结果:

enter image description here


2

如果可能的话,最好的方法是一开始就不要让它们出现。如果这些线条是图像中的噪点,则可以应用平滑滤波器(例如高斯滤波器)来使图像平滑。-> 高斯滤波器信息

一旦它们出现了,删除它们就很棘手,可能需要一些更高级别的形状识别技术。


Canny算法内置高斯模糊 - 无需单独步骤。 - Roger Rowland
1
但如果平滑效果不够强,仍然会出现伪影,预过滤阶段(使用不一定是高斯滤波器)可能会有所帮助。 - Samuel Barnett
没错,我只是指出你建议的高斯模糊已经是Canny算法的一部分了。 - Roger Rowland
我猜想没有办法修改OpenCV内置的高斯函数来适用于Canny函数?你需要完成这个额外的步骤吗? - James L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接