实例详解如何选择滤波算法
源:机器视觉算法与应用
在机器视觉中,图像滤波器无处不在。例如,它们用于减少图像噪声,改善对比度或检测边缘。本文将向您介绍MVTec HALCON中一些最常用的滤波器,它们是如何工作的以及可以用于什么。
mean_image:均值滤波器
首先,我们读取具有背景纹理的示例图像。我们的目标是在不改变实际信息的情况下删除背景纹理。让我们从一个易于理解的通用运算符开始:mean_image。
在生成的图像中,背景纹理已被很好地去除,但是很多相关信息已经丢失。那么,此滤波器如何工作?
为了调用mean_image, 我们指定了掩码大小。
*Halcon mean_image 函数原型
mean_image(Image : ImageMean : MaskWidth, MaskHeight : )
read_image(Image,'plan_01')mean_image(Image,Mean,3,3)
对于每个像素,将创建具有指定宽度和高度的蒙版。然后,我们在此蒙版中获取灰度值并计算平均值。将该平均值分配给中心像素。因此,图像滤波后非常均匀平滑。
另一个类似的运算符是median_image。
median_image:中值滤波器
默认情况下,使用圆形蒙版。对灰度值进行排序,并将“中间”值设置为新的灰度值。因此,中位数是更可靠的平均值,离群值对其影响不大。此外,在保留锐利边缘方面要好得多。
但是,更详细的信息,例如此处显示的数字,应用滤波器后仍然很模糊。为了进行比较,这是均值滤波器的结果。
还有更多运算符可用于平滑图像。请参阅“滤波器/平滑处理”一章参考,以获取全面概述。
为了消除此图像中的背景噪音,使用滚动导向滤波器(Rolling Guidance Filter)是一种高级选择。您可以在文档中看到令人印象深刻的结果。
第(3)张图片显示了提取的纹理。要获得此图像,我们使用算术滤波器sub_image。在这里,我们将原始图像减去被滤波器过滤的图像。生成的图像显示了提取的纹理。
滤波器的常见用例
让我们看一下基本过滤器的一些常见用例。
去除噪声
在这里,我们读取了植物的图像,并添加了一些椒盐噪声。使用median_image,我们可以非常有效地消除这种噪声。另外,白噪声是硬件引入的常见问题。在这里,均值滤波器和中值滤波器都可以产生好的结果。
使用滚动式导向滤波器,结果看起来非常不错。但是总运行时间会大大增加。在此太阳能电池图像中,我们希望摆脱水平线。在此,中值滤波器产生视觉上令人满意的结果。
图像分割
在下一张图片中,我们的目标是使用阈值来检测缺陷。但是,在灰色直方图中,我们不容易看到缺陷。因此,我们应用中值滤波器,现在,直方图中这个小的“丘陵”变得可区分并且可以轻松地进行分段,如下图所示,medain_filter前后。类似地,可以在分割图像以创建感兴趣区域之前应用滤波器。
另一个很好的例子是您要识别图像中的文本。通过滤波器预处理改善运行时间或提高鲁棒性。
一个常见的分割运算符是dyn_threshold,它使用局部阈值。通常,ThresholdImage是原始图像的平滑版本。在此示例中,我们使用它粗略地划分了盲文。
*Segment braille with dyn_threshold.
read_image (Image,'photometric_stereo/embossed_01')
mean_image (Image,ImageMean,60,60)
dyn_threshold (Image, ImageMean, RegionDynThresh, 15, 'not_equal')
校正不均匀照明
滤波器的另一个常见用例是照明的校正(算术滤波器的使用)。在这里,我们使用背光设置获取图像。注意照明不是完全均匀的。为了解决这个问题,我们获取背景图像,然后从原始图像中减去该背景图像。结果是更好的照明图像。
*correct illumination.read_image (Image,'images/correct_shading_02.png')read_image (Background, 'images/correct_shading_01.png')sub_image (image,Background,ImageSub, 1,255)
增强局部细节
在此图像中,我们要增强细节。为此,我们首先对图像进行平滑处理。然后,我们从原始图像中减去平滑图像,从而为我们提供了细节。然后,我们将这些详细信息添加到原始文件中。如下图所示增强局部细节前后。
*Enhance details.
read_image (Image,'angio-part')
guided_filter(Image,image,ImageSmooth,5,10)
sub_image (Image,ImageSmooth,ImageDetail,5,0)
add_image(ImageDetail,Image,ImageDetailEnhanced,1,0)
最后,需要说明滤波器时必须注意的一个效果:
在reduce_domain时使用的是缩小区域,大多数过滤器仅返回输入域中包含的像素的结果,区域外的像素变为“未定义”。当应用两个或多个滤波器时,这可能会导致图像边界出现伪影。