Halcon图像平滑与去噪mean_image/median_image/gauss filter/equ_histo _image
有时拍摄的图像中会存在很多杂点和噪声,对于比较均匀的噪声,可以考虑用软件的算法进行消除。例如,可以用图像平滑的方法进行去噪,主要的方法有均值滤波、中值滤波、高斯滤波等。
Halcon图像平滑与去噪
有时拍摄的图像中会存在很多杂点和噪声,对于比较均匀的噪声,可以考虑用软件的算法进行
消除。例如,可以用图像平滑的方法进行去噪,主要的方法有均值滤波、中值滤波、高斯滤波等。
1. 均值滤波
均值滤波的原理就是将像素灰度值与其邻域内的像素灰度值相加取平均值。该滤波器区域就如同一个小的“窗口”,在图像上从左上角开始滑动,将该“窗口”内的像素灰度值相加并取平均值,然后将该灰度值赋值给“窗口”中的每一个像素。在Halcon中使用mean_image算子进行均值滤波代码举例如下:
read_image (ImageNoise, 'data/marker')
mean_image (ImageNoise, ImageMean, 9,9)
dev_display (ImageMean)
在这个例子中,mean_imag 算子的第一个参数ImageNoise 是输入的带噪声的图像;第二个经数ImageMcan 是输出的均值滤波后的图像;9是卷积核的尺寸,即“窗口”中包含的像素的横纵坐标方向的尺寸。注意,这里滤波器的“窗口”尺寸一般都是奇数像素尺寸的正方形,如3、5、7、9 11、15等,因为奇数可以保证中心像素处于滤波器正中间。该尺寸默认取9。均值滤波效果如图所示。
图(a)为输入的带噪声的图像,图(b)为均值滤波后的图像。可见,该方法能有效地消除一些高斯噪声,但也容易导致图像变得模糊。因此,对一些图像边界或是需要准确分割的区域,需要考虑使用边界处理的算法或者其他更好的方法。
2. 中值滤波
中值滤波的原理与均值滤波相似,不同的是,它以像素为中心,取一个指定形状的邻域作为滤波器,该形状可以是正方形,也可以是圆形。然后将该区域内的像素灰度值进行排序,以排序结果的中间值作为灰度计算结果赋值给该区域内的像素。在Halcon中使用median_image算子进行均值滤波,代码举例如下:
read _image (ImageNoise, 'data/marker')
median_image (ImageNoise, ImageMedian, 'circle', 3, 'continued')
dev_display (ImageMedian)
在这个例子中,median_image算子的参数解释如下。第1个参数ImageNoise 是输入的带噪声的图像。第2个参数ImageMedian 是输出的中值滤波后的图像。
第3个参数是邻域的形状,这里选择circle,也可以选择square。
第4个参数是卷积核的尺寸,这里选择3,表示圆形的半径是3个像素。注意,如果第3个参
数选择square,那么这里选择3,表示正方形的边长是2×3+1,即7。
第5个参数表示边界的处理方式,因为边界处往往无法移动滤波“窗口”,因此需要对像素做些补充。这里选择continued,表示延伸边界像素。也可以选择cyclic,表示循环延伸边界像素。中值滤波效果如图所示。
由图 可知,该方法对于去除一些孤立的噪声点非常有效,也能够保留大部分边缘信息。但
是在使用时也要注意滤波器的尺寸的选择,如果选得太大,也容易造成图像的模糊。
3. 高斯滤波
高斯滤波与前两种方法不同的是,它利用的滤波器不是简单地求均值或者排序,而是调用一个二维离散的高斯函数。高斯滤波适用于去除高斯噪声。在Halcon中使用gauss_filter算子进行高斯滤波,代码举例如下:
read image (ImageNoise, 'data/marker')
gauss filter (ImageNoise, ImageGauss, 5)
dev_dísplay (ImageGauss)
在这个例子中,gauss_filter算子的参数如下。
第1个参数ImageNoise 是输入的带高斯噪声的图像。
第2个参数 ImageGauss 是输出的高斯滤波后的图像。
第3个参数是滤波器的尺寸,尺寸值越大,平滑效果就越明显。可以根据实际效果调节该参数,
-般取3、5、7、9、11。高斯滤波效果如图所示。
图(a)为带高斯噪声的图像,图(b)为应用了高斯滤波器后的图像。与前两种方法相比,高斯滤波能够保留更多的边缘和细节,图像更为清晰,平滑的效果也更加柔和。
5. 光照不均匀
光照不均匀是采集图像时常见的一个问题,由于拍摄环境的光线变化导致图像受光不均匀,这将增加识别图像的难度。可以首先考虑改变硬件环境以避免这一情况,如增加遮光罩、增加光源,或者改变打光方式。硬件上的调整能显著地改善图像质量,为软件提供高质量的图像输入。但是如果条件有限,不便于改变硬件环境或重新采集图像,也可以通过软件算法改善这一情况。
改善光照的方式有很多,本文列举一种,即采用通道分离的方式对彩色图像进行光线均衡化处理。其步骤如下。
(1)输入光照不均匀的彩色图像。这里强调彩色图像,是因为黑白图像是单通道,不适用于这种方法,可以直接通过直方图均衡的方式对图像进行增强。
(2)分离出RGB通道。使用decompose3算子将图像分离成红绿蓝3个通道,并将每个通道单
独存成一幅图像。
(3)对每个颜色通道的图像进行直方图均衡,使其色彩过渡更加平滑。
(4)将平滑后的3个通道的图像重新组合成三通道的彩色图像。这里使用compose3算子将三通道图像重新组合。
完成上述步骤的图像效果如图所示。
下面是实现这一过程的代码:
read image (test, 'data/label')
decompose3(test, imagel, image2, image3)
mean_image (imagel, Meanl, 9, 9)
emphasize (Meanl, em1, 5, 5, 1.5)
illuminate (eml, ImageIl, 20, 20, 0.55)
equ_histo _image (image2, ImageEquHisto2)
equ_histo _image (image3, ImageEquHisto3)
compose3 (ImageI1, ImageEquHisto2, ImageEquHisto3, MultichannelImage)
dev_display(MultiChannelImage)
由图可以看出,图像光线不均匀的情况有所改善,阴影部分的文字也显露出来了,但是仍然存在局部较大,边缘不清晰等情况。因此,还应当结合去噪和平滑等方法,进一步增强图像质量。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)