图像处理笔记(七)

空间滤波基础

空间相关和卷积

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

read_image(Image, 'convolution')

f:= [3, 3, 3, 0, 0, 0, 1, 1, 1, 0, 0, 0]
convol_image(Image, ImageResult, f, 'mirrored')

f1:= [3, 3, 3, 0, 1, 0, 0, 1, 0, 0, 1, 0]
convol_image(Image, ImageResult1, f1, 'mirrored')

从左到右分别是原图,使用f和使用f1卷积后的结果。可以看出来图二中横的细节更清晰,而竖的细节模糊了,图三相反。

均值滤波

实现图像平滑。
在图像中任意位置(x, y)的灰度平均值是以(x, y)为中心的3*3邻域的9个灰度值之和除以9。
按照这样的定义,使用convol_image算子可以实现均值滤波:

f3 := [3, 3, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1]
convol_image(Image, ImageResult3, f3, 'mirrored')

此外,halcon直接提供了一个均值滤波器,可以实现相同的效果:

mean_image(Image, ImageMean, 3, 3)

平滑空间滤波器

用于在大目标提取之前去除图像中的一些琐碎细节,以及桥接直线或曲线的缝隙。

  1. 平滑线性滤波器
    均值滤波器是一种低通滤波器。
    降噪原理:典型的随机噪声由灰度级的急剧变化组成,因此平滑处理能降低噪声。但是由于图像边缘也是这种情况,均值滤波会导致边缘模糊的负面效应。
    加权均值滤波 滤波器的系数不全为1,例如使用这样的滤波器:

[frac{1}{16}left[ egin{matrix} 1 & 2 & 1 \ 2 & 4 & 2 \ 1 & 2 & 1 end{matrix} ight] ]

模板的大小由哪些即将融入背景中的物体的尺寸来决定

  1. 统计排序(非线性)滤波器
    中值滤波器 处理脉冲噪声(椒盐噪声),这种噪声以黑白点的形式叠加在图像上。使拥有不同灰度的点看起来更接近它的相邻点。
median_image(Image2, ImageMedian, 'circle', 2, 'mirrored')

使用半径为2的圆形滤波器做中值滤波:

锐化空间滤波器

一阶微分:

[frac{partial f}{partial x} = f(x + 1) - f(x) ]

二阶微分

[frac{partial ^{2} f}{partial x^{2}} = f(x + 1) + f(x - 1) - 2f(x) ]

数字图像边缘在灰度上类似于斜坡过渡,由于沿着斜坡的一阶微分非0,一阶微分会产生较粗的边缘。二阶微分产生由零分开的一个像素宽的双边缘;
因此,二阶微分在增强细节方面要比一阶微分好,是一个适合锐化图像的理想特征。

拉普拉斯算子

各向同性滤波器 滤波器的响应与滤波器作用的图像的突变方向无关,是旋转不变的,即原图像旋转后进行滤波处理给出的结果与先滤波再旋转得到的结果相同。
拉普拉斯算子

[ abla ^{2} f = frac{partial ^{2} f}{partial x^{2}} + frac {partial ^{2} f}{partial y^{2}} ]

对于二维图像f(x, y),分别在x, y方向上求二阶偏导数,推导出两个变量的离散拉普拉斯算子是:

[ abla ^{2}f(x, y) = f(x + 1, y) + f(x - 1, y) + f(x, y + 1) + f(x, y -1) - 2f(x, y) ]

滤波器模板:

a是实现上面的算子所用的滤波器模板,b是对a做了对角线扩展,c和d是将a和b乘上了-1。
将原图像和拉普拉斯图像叠加在一起,可以复原背景特性并保持拉普拉斯锐化处理的效果,可以表示为:

[g(x, y) = f(x, y) + c[ abla^{2}f(x, y)] ]

当使用a或b模板时,c=-1,当使用c或d时,c=1。看中心系数是正还是负。
Halcon中可以直接使用相应的模板做卷积:

f := [3, 3, 1, 0, 1, 0, 1, -4, 1, 0, 1, 0]

convol_image(Image, ImageResult, f, 'mirrored')

* 将拉普拉斯变换后的图像与原图像叠加,得到锐化后的图像
abs_diff_image(Image, ImageResult, ImageAbsDiff, 1)

halcon中有定义好的laplace模板,把f替换为‘laplace4’,
此外还有直接定义好的拉普拉斯算子laplace。

非锐化掩蔽和高提升的滤波

非锐化掩蔽 从原图中减去平滑过的原图像得到一幅模板,再加到原图象上。
(foverline (x, y)) 表示模糊图像,非锐化掩蔽以公式描述:
模板:

[g_{mask}(x, y) = f(x, y) - foverline (x, y) ]

在原图上加上该模板的一个权重部分:

[g(x, y) = f(x, y) + k * g_{mask}(x, y) ]

当权重系数k = 1时,上面的定义称为非锐化掩蔽;k > 1时,称为高提升滤波;k < 1 不强调非锐化模板的贡献。

dev_close_window ()

dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
 
read_image(Image, 'dipxe_text')

* 高斯滤波器平滑
gauss_filter(Image, ImageGauss, 3)

* 和原图相减
sub_image(Image, ImageGauss, ImageSub, 1, 0)

* 线性变换,令k=4.5
scale_image(ImageSub, ImageScaled, 4.5, 0)

* 图像叠加
add_image(Image, ImageScaled, ImageResult, 1, 0)

图就不放了,用的都是书上的图实现了一下。

使用一阶微分对非线性图像锐化——梯度

Sobel算子
罗伯特交叉梯度算子

感觉效率有点下降了。。。。明天把这一章看完之后做一个小结,什么样的图像类型需要用什么样的滤波器处理,说明大概是为什么。

用到的Halcon算子

  1. convol_image(Image, ImageResult, FilterMsk, Margin):使用指定的卷积核FilterMask进行卷积。
    FilterMask可以是已经定义好放在一个文件中的,也可以是自己写的一个矩阵,写成tuple:[MaskHeight, MaskWidth, Weight, V1, V2]
    例如(常见的高斯滤波器):

[frac{1}{16}left[ egin{matrix} 1 & 2 & 1 \ 2 & 4 & 2 \ 1 & 2 & 1 end{matrix} ight] ]

写成tuple: [3, 3, 16, 1, 2, 1, 2, 4, 2, 1, 2, 1]
写在文件中(没有试过):
3 3
16
1 2 1
2 4 2
1 2 1

  1. mean_image(Image, ImageMean, MaskWidth, MaskHeight):使用宽为MaskWidth,高为MaskHeight的卷积核进行均值滤波
  2. median_image(Image, ImageMedian, MaskType, Radius,Margin):中值滤波器,使用半径为Radius的形状为MaskType的滤波器进行中值滤波
  3. laplace(Image, ImageLaplace, Result, MaskSize, FilterMask):拉普拉斯算子
  4. gauss_filter(Image, ImageGauss, Size):指定Size的高斯滤波器
  5. roberts(Image, ImageRoberts, FilterType):用Robert滤波器发现图像边缘
  6. sobel_amp(Image, EdgeAmplitude, FilterType, Size):使用Sobel滤波器发现图像边缘,过滤器使用下面两个矩阵作为模板:

[A = left[ egin{matrix} 1 & 2 & 1 \ 0 & 0 & 0 \ -1 & -2 & -1 end{matrix} ight] ]

[B = left[ egin{matrix} 1 & 0 & -1 \ 2 & 0 & -2 \ 1 & 0 & -1 end{matrix} ight] ]

原文地址:https://www.cnblogs.com/yutou2016/p/11095291.html