Halcon——图像增强算子以及分类
摘要
图像增强就是指通过某种图像处理方法对退化的某些图像特征,如边缘、轮廓、对比度等进行处理,以改善图像的视觉效果,提高图像的清晰度,或是突出图像中的某些“有用”,压缩其他“无用”信息,将图像转换为更适合人或计算机分析处理的形式。
图像增强技术根据增强处理时所处的空间不同,基本可以分为两类:空间域法和频域法。
- 空间域可以简单地理解为包含图像像素的空间,空间域法是指空间域中,也就是图像本身,直接对图像进行各种线性或非线性运算,对图像的像素灰度值做增强处理。空间域法又分为点运算和模板处理两大类。
- 点运算是作用于单个像素邻域的处理方法,包括图像灰度变换、直方图修正、伪彩色增强技术;
- 模板处理是作用于像素领域的处理方法,包括图像平滑、图像锐化等技术。
- 频域法则是在图像的变换域中把图像看成一种二维信号,对其进行基于二维傅里叶变换的信号增强。对其进行基于二维傅里叶变换的信号增强。常用的方法包括低通滤波、高通滤波以及同态滤波等。
如图概括了常用的图像增强的方法:
下面介绍一些Halcon中常用的图像增强算子。
一、空间域
1、线性灰度变换:一般不改变像素点的坐标信息,只改变像素点的灰度值
- scale_image— 缩放图像的灰度值
scale_image(Image : ImageScaled : Mult, Add : )
原理:算子scale_image对输入的图像(Image)进行如下变换:
g’ := g * Mult + Add
通过参数3、4来改变图像的像素灰度值,从而达到增强图像对比度的目的,注:参数3/4设为1,0,则图像灰度值未发生改变
作用:拉开图像的对比度,让图像中黑的地方更黑,亮的地方更亮。
效果:
read_image (Image, 'C:/Users/Administrator/Desktop/1.png') scale_image (Image, ImageScaled, 1.5, -150)
- emphasize——图像增强
emphasize(Image : ImageEmphasize : MaskWidth , MaskHeight, Factor : )
原理:首先,该过程使用低通(mean_image)进行过滤。由得到的灰度值(mean)和原始灰度值(orig)计算得到的灰度值(res)如下:
res := round((orig - mean) * Factor) + orig
通过参数3、4控制均值滤波模板的大小,数值越大,则图像对比度越强,一般配合参数5—Factor(对比度强度)一起对图像进行增强处理。
作用:增强图像的高频区域(边缘和拐角),使图像看起来更清晰。
效果:
read_image (Image, 'C:/Users/Administrator/Desktop/1.png') emphasize (Image, ImageEmphasize, 7, 7, 1)
2、 非线性灰度变换
单纯的线性灰度变换可以在一定程度上解决视觉上的图像整体对比度问题,但是对图像细节部分的增强较为有限,结合非线性变换技术可以解决这一问题。非线性变换不是对图像的整个灰度范围进行扩展,而是有选择的对某一灰度范围进行扩展,其他范围的灰度则有可能被压缩。常用的非线性变换有对数变换和指数变换。
- log_image — 对图像做底数为Base 的对数变换
log_image(Image : LogImage : Base : )
概念:图像灰度的对数变换可以扩张数值较小的灰度范围或者压缩数值较大的灰度范围。对数变换是一种有用的非线性映射交换函数,可以用于扩展图像中范围较窄的低灰度值像素,压缩输入图像中范围较宽的高灰度值像素,使得原本低灰度值的像素部分能更清晰的呈现出来。
原理:对图像的灰度值取对数,得到新的灰度值,第3个参数为对数的底,默认值为’e’
效果:
read_image (Image, 'C:/Users/Administrator/Desktop/1.png') log_image (Image, LogImage,'e')
- pow_image— 对图像做伽马为Exponent的指数变换
pow_image(Image : PowImage : Exponent : )
概念:指数变换映射关系与对数变换的不同之处在于,指数变换可以根据伽马Exponent 的不同取值有选择性地增强低灰度区域的对比度或是高灰度区域的对比度
效果:
read_image (Image, 'C:/Users/Administrator/Desktop/1.png') pow_image (Image, PowImage, 2)
2、直方图均衡化
直方图均衡化是一种最常见的直方图修正法。这种方法的思想是把原始图像的直方图为均匀分布的形式,增加像素灰度值的动态范围。也就是说直方图均衡化是使原图像中具有相近灰度且占有大量像素点的区域的灰度范围展宽,使大区域中的微小灰度变化呈现出来,增强图像整体对比度效果,使图像更加清晰。
equ_histo_image(Image : ImageEquHisto : : )
效果:
read_image (Image, 'C:/Users/Administrator/Desktop/1.png') equ_histo_image (Image, ImageEquHisto)
二、频域
频率特征是图像的灰度变化特征,低频特征是灰度变化不明显,例如图像整体轮廓,高频特征是图像灰度变化剧烈,如图像边缘和噪声。
一个重要的经验结论:低频代表图像整体轮廓,高频代表了图像噪声,中频代表图像边缘、纹理等细节。什么时候使用傅里叶变换进行频域分析?
1、具有一定纹理特征的图像,纹理可以理解为条纹,如布匹、木板、纸张等材质容易出现。
2、需要提取对比度低或者信噪比低的特征。
3、图像尺寸较大或者需要与大尺寸滤波器进行计算,此时转换至频域计算,具有速度优势。因为空间域滤波为卷积过程(加权求和),频域计算直接相乘。
在halcon中,使用频域进行检测,有两个步骤是比较关键的:①生成合适的滤波器;②空间域和频域之间的转换。
1、高通滤波法
图像中的边缘或细条等细节部分与图像频谱的高频分量相对应,因此采用高通滤波让高频分量顺利通过,使图像的边缘或细条等细节变得清楚,实现图像的锐化。高通滤波可用空频法或频域法来实现。在空间域是用卷积方法,与空域低通滤波的邻域平均法类似,不过其中的冲激响应方阵H不同。
- gen_gauss_filter— 在频域生成高斯滤波器
gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )
参数:
ImageGauss(out) :生成的滤波器图像
Sigma1:空域(像素域)中,高斯分布在滤波器主方向的标准差
Sigma2:空域(像素域)中,高斯分布在垂直于滤波器主方向的标准差。注:Sigma1和Sigma2确定空间域内高斯函数的平滑量
Phi:滤波器在空间域的主要方向
Norm:滤波器的归一化因子。注:如果使用fft_image和fft_image_inv进行过滤,必须设置参数Norm = 'none’和Mode = ‘dc_center’(本文未使用)
Mode:频率图中心位置。注: 如果使用实值快速傅里叶变换算子rft_generic, 则Mode = ‘rft’ ;如果使用快速傅里叶变换算子fft_generic,则可以使用Mode = 'dc_edge’来提高效率
Width, Heigh:生成滤波图像的宽、高
原理:首先产生一个高斯核,然后根据输入的参数对这个高斯核矩阵做傅里叶变换(实现从空域或时域到频域的转换工具),得到特定模式和特定分辨率的所谓频域的滤波器,例如我要进行rft_generic的变换,那么我的高斯滤波器模式就要写为‘rft’。并通过设置参数保持频域滤波器和原图像一致。
- rft_generic— 计算图像的实值快速傅里叶变换,一般需要使用两次,因为在频域处理完之后,还需要转换成空间域。
rft_generic(Image : ImageFFT : Direction, Norm, ResultType, Width : )
参数:
Image:输入图像
ImageFFT(out) :傅里叶变换输入图像
Direction:计算正向或反向变换。‘to_freq’是空间域—>频域的变换,ResultType一般选择’complex’;‘from_freq’是频域—>空间域的变换,ResultType一般选择’byte’(灰度图像)。
Norm:变换的归一化因子
ResultType:输出图像的图像类型,配合Direction参数设置
Width :输入图像的宽度
原理:其实gen_gauss_filter得到的滤波器,就是一个图像,虽然是频域滤波器,但是单纯看物理意义,他就是一个图像。与时域空间卷积核的物理意义是相同的。对这幅频域图进行卷积(卷积过程与时域无差别),卷积之后图像就产生了变化,比如外环得到减弱,内环得到保留(高低通滤波器的效果),或者在某个方向上得到保留(gabor滤波器的效果),再还原到时域,发现跟原图变化很大。
- convol_fft— 在频域用滤波器对图像进行卷积
convol_fft(ImageFFT, ImageFilter : ImageConvol : : )
原理:将复合图像ImageFFT的像素乘以滤波图像滤波器的对应像素。
效果:
read_image (Image, 'C:/Users/Administrator/Desktop/1.png') get_image_size (Image, Width, Height) *在频域中生成高斯滤波器 gen_gauss_filter (ImageGauss, 100, 100, 0, 'n', 'rft', Width, Height) *对图像进行傅里叶变换 rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width) *对傅里叶图像做卷积,使用之前创建的高斯滤波器作为卷积核 convol_fft (ImageFFT, ImageGauss, ImageConvol) *将卷积后的傅里叶图像还原为空间域图像。可见图像的突变部分得到了增强 rft_generic (ImageConvol, ImageFFT1, 'from_freq', 'none', 'byte', Width) sub_image (Image, ImageFFT1, ImageSub, 5, 100) *对图像进行缩放,一般图像特别大的时候,缩放一下,提取效果会更好 zoom_image_factor (ImageSub, ImageZoomed, 0.4, 0.4, 'constant') *将图像中的有灰度差异的线条提取出来 lines_gauss (ImageZoomed, Lines1, 0.2, 3, 8, 'light', 'true', 'gaussian', 'true')
注:当图像质量不理想时,提取线条的效果不好时,不妨试试这种方法,亲测效果很好。
此外,还有一些图像增强的方法:
- 灰度图像形态学(对灰度图像使用下面算子)
①gray_opening:结构元素在图像中滑,灰度值最高的值作为新值,有使图像变亮的作用。
②gray_closing:结构元素在图像中滑,灰度值最低的值作为新值,有使图像变暗的作用。
③gray_range_rect:用一个矩形结构元素在图像中滑动,新值 = (矩形中最大的)灰度值-(矩形中最大的)最小的灰度值
-
mult_image(Image1, Image2 : ImageResult : Mult, Add : ) — 将图像变化较大的部位通过图像相减处理提取出来,再和原图简单相加
read_image (Image, 'C:/Users/Administrator/Desktop/1.png') *图二 mult_image (Image, Image, ImageResult, 0.05, 1) *图三 mult_image (Image, Image, ImageResult, 0.002, 1)
转载博文:(2条消息) [Halcon] 图像增强相关算子及其分类_Loewen丶的小窝-CSDN博客