【机械视觉】Halcon—【四、Halcon中的图像预处理】

【机械视觉】Halcon—【四、Halcon中的图像预处理】

本文系统介绍了Halcon中的图像预处理技术,重点涵盖图像增强、滤波和频域处理三大类方法。在图像增强方面,详细解析了空间域(灰度变换、直方图修正)和频域法(傅里叶变换滤波)的原理与算子实现,如emphasize对比度增强和equ_histo_image直方图均衡化。针对噪声处理,对比了均值滤波(高斯噪声)、中值滤波(椒盐噪声)和高斯滤波的特点及算子应用(如median_image)等等。

目录

【机械视觉】Halcon—【三、Halcon中的图像预处理】

一、图像增强

图像增强技术基本分为两类:

二、线性变化分段

三、非线性变化

四、直方图

五、直方图均衡化

六、图像滤波

(1)-均值滤波

(2)-中值滤波

(3)-高斯滤波

(4)-图形锐化

(5)-图像运算

(6)-高通滤波

(7)-低通滤波

噪声分类:

1、椒盐噪声(盐=白色,椒=黑色)

2.随机噪声

3.高斯噪声


一、图像增强

图像增强:有目的的强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同特征之间的差别,抑制不感兴趣特征,改善图像质量,丰富信息量,满足分析需要。

图像增强技术基本分为两类:
  • 1、空间域法:包含图像像素的空间,在空间域中,直接对图像进行各种线性或非线性运算,对图像的像素灰度做增强处。分为点运算(作用于像素领域的处理方法,包括灰度变换,直方图修正,伪彩色增强等)和模板处理(作用于像素领域的处理方法,包括平滑,图像锐化等)两大类。
  • 2、频域法:在图像的变换域中把图像看作一种二维信号,对其进行基于二维傅里叶变换的信号增强,常用的方法有低通滤波,高通滤波及同态滤波。
**图像增强**:有目的的强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣(ROI)的特征,
*扩大图像中不同特征之间的差别,抑制不感兴趣特征,改善图像质量,丰富信息量,满足分析需要
read_image (Image, 'printer_chip/printer_chip_01')
dev_close_window ()
get_image_size (Image, Width, Height)

*打开窗口以适应大小
*-1,-1 这俩个参数打开窗口的宽度和高度的限制,设置了-1,-1就是默认值[500,800][400,600]
*如果实际窗口高度宽度无法满足范围,忽略大小限制
dev_open_window_fit_size (0, 0, Width, Width, -1, -1, WindowHandle)
dev_display (Image)

*截取窗口,保存截图
*1 要截取的窗口
*2 图片的格式
*3 设置的保存路径
dump_window (WindowHandle, 'bmp', 'C:/Users/86152/Desktop/1.bmp')

*图像灰度值取反操作,(黑的变白 白的变黑)
*1 输入图像
*2 输出的图像
invert_image (Image, ImageInvert)


*增强对比度(黑的更黑,白的更白)
*1 输入图像
*2 输出图像
*3、4参数 掩膜大小就是3*3矩阵,值越大可能模糊细节
*5 对比度,值越大,对比度越明显
emphasize (ImageInvert, ImageEmphasize, 3, 3, 100)

*减少对比度
* 1输入图像 2输出图像 
* 3比例 大于等于1 值更亮,小于1 更暗
* 4 补偿值 输出图像的灰度值= 输入的图像的灰度值*比例+补偿值
*scale_image (ImageEmphasize, ImageScaled, 0.1, 205)

* 增强亮度一般使用在光照比较弱的情况
scale_image (ImageEmphasize, ImageScaled, 1, 200)

*减少亮度  一般使用在光照比较强的情况
*scale_image (ImageEmphasize, ImageScaled, 1, -200)

二、线性变化分段

线性变化分段:指的是将图像的亮度或颜色值从一个范围映射到另一个范围的过程。这个过程可以通过一系列的线性变换来实现,每个变换段可以独立控制。例如,可以将较暗的区域映射到中间亮度,而将较亮的区域映射到更高亮度,从而调整图像的整体对比度

*指的是将图像的亮度或颜色值从一个范围映射到另一个范围的过程。这个过程可以通过一系列的线性变换来实现,
*每个变换段可以独立控制。例如,可以将较暗的区域映射到中间亮度,
*而将较亮的区域映射到更高亮度,从而调整图像的整体对比度
read_image (Image, 'printer_chip/printer_chip_01')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window_fit_size (0, 0, Width, Width, -1, -1, WindowHandle)
dev_display (Image)

*求区域的最小和最大的灰度值
*1 待检查区域
*2 输入的灰度值图像
*3 0 默认情况下计算所有像素的最大值和最小值,例如 5:相当于5%的比例,排除最大值的5%,排除5%最小值的范围,
*排除一些极端值 计算更稳定的最大值和最小值
*4、5 最大值和最小值
*6 最大值减去最小值
min_max_gray (Image, Image, 0, Min, Max, Range)

*自动灰度归一化的算子,会将输入图像灰度值线性缩放直最大范围可能 使灰度值更均匀化,
scale_image_max (Image, ImageScaleMax)
dev_display (ImageScaleMax)

三、非线性变化


read_image (Image, 'printer_chip/printer_chip_01')

dev_close_window ()
get_image_size (Image, Width, Height)

dev_open_window_fit_size (0, 0, Width, Width, -1, -1, WindowHandle)

dev_display(Image)

stop()


* 对数变化  压缩低灰度值的级别    降低高灰度值的级别

*参数1: 输入图像
*参数2: 输出图像
*参数3: 底数
* log_image (Image, LogImage, 2)
* log_image (Image, LogImage, 0)




* 指数比那花   选择增强低灰度值对比度  或者 高度灰度值的对比度

* 参数3:  
* 指数:  0-1  增强高灰度值对比度
       * 大于等于1 增强低灰度值对比度
pow_image (Image, PowImage, 2)

四、直方图

灰度直方图:数字图像中每一个灰度值与其出现频率的统计关系

直方图特征:

  • 1. 没有位置信息
  • 2. 与图像之间为一对多的映射关系,任意一幅图像都有唯一确定的一个直方图与之对应,但不同的图像可能有相同的直方图
  • 3. 可叠加性,各个子区域之和等于该图像全图的直方图

获取直方图方式:

  • 1. HDevelop 工具上直接打开
  • 2. 用算子获取直方图的的图案,用区域类型保存,最后在窗体上渲染。

相关算子

  • gray_histo(regions需要计算的区域,image输入的图像:::absolutehisto绝对分布,relativehisto相对分布)
  • 参数列表:regions需要计算的区域 告诉函数,求image输入图像哪个区域的直方图。
  • gen_region_histo(:region需要输入的区域:histogram灰度分布,row直方图中心行坐标,column直方图中心列坐标,scale直方图比例:)
read_image (Image, 'printer_chip/printer_chip_01')


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

set_display_font (WindowHandle, 16, 'mono', 'true', 'false')

dev_disp_text ('展示Image的直方图', 'window', 'top', 'left', 'black', [], [])




* 求图像的灰度直方图
* 参数1: 需要计算的区域 
gray_histo (Image, Image, AbsoluteHisto, RelativeHisto)


*  将灰度直方图的绝对分布 生成区域类型
gen_region_histo (Region, AbsoluteHisto, 255, 255,1)

五、直方图均衡化

将密集的灰度值拉开一定的距离
作用: 使有蒙层的图像 马赛克 ... 图像变得更清晰

* read_image (Image, 'printer_chip/printer_chip_01')
read_image (Image, 'F:/AI视觉35班/05_Halcon/04_图像预处理/img/2.tif')
dev_close_window ()

get_image_size (Image, Width, Height)
dev_open_window_fit_size (0, 0, Width, Width, -1, -1, WindowHandle)
dev_display (Image)



* 直方图均衡化算子

equ_histo_image (Image, ImageEquHisto)


六、图像滤波

(1)-均值滤波

主要目的是消除高斯噪声

均值滤波的原理就是将像素灰度值与其邻域内的像素灰度值相加取平均值。该滤波器区域就如同一个小的“窗口”,在图像上从左上角开始滑动,将该“窗口”内的像素灰度值相加并取平均值,然后将该灰度值赋值给“窗口”中的中心像素。

优点:对图像内部的噪声及模糊图像有很好的作用。

缺点:使用均值滤波计算均值会将图像中的边缘信息与特征信息“模糊”掉,丢失很多特征。

read_image (Image, 'printer_chip/printer_chip_01')
dev_display (Image)

*创建一个高斯噪声点 值越大 噪声越明显
gauss_distribution (100, Distribution)

*将噪声添加到指定图像上,并且生成一个噪声图
add_noise_distribution (Image, ImageNoise, Distribution)

dev_display (ImageNoise)

*mean 平均值 使用均值滤波进行消除噪声
*9*9 就是滤波核
mean_image (ImageNoise, ImageMean,3, 3)

(2)-中值滤波

主要目的是消除椒盐噪声

中值滤波的原理与均值滤波相似,不同的是,它以像素为中心,取一个指定形状的邻域作为滤波器,该形状可以是正方形,也可以是圆形。然后将该区域内的像素灰度值进行排序,以排序结果的中间值作为灰度计算结果赋值给该区域内的像素

优点:对单个噪声有很好的平滑作用,尤其是椒盐噪声。

read_image (Image, 'printer_chip/printer_chip_01')
dev_display (Image)

*创建椒盐噪声
*参数1 白色的噪声的比例
*参数2 椒噪声的比例
sp_distribution (5, 5, Distribution)

*将噪声添加到Image上 产生一个带有噪声的图像
add_noise_distribution (Image, ImageNoise, Distribution)

*中值滤波消除椒盐噪声
*参数1 噪声图片
*参数2 消除的噪声的图片
*参数3 滤波器的采用形状 优先采用circle
    *'circle' 圆形的滤波器 边缘保留更好
    *'square' 正方形的滤波器 滤波效率更快
*参数4 滤波器尺寸 假设值设置为3
    *'circle' :滤波器的半径是3,
    *'square':滤波器的边长是是2*3+1=7,就是7*7的矩阵
*参数5 边界的处理方式
   *'mirrored':镜像处理方式
   *'cyclic' :循环处理方式
   *  原理:
     *  将图像视为循环延拓的(即假设图像上下左右首尾相连)。超出边界的像素值从对侧获取。
   * 示例:
     * 若窗口超出左边界,则从右侧取对应像素;超出上边界则从下侧取。
   *mirrored'(镜像填充)
    *原理:
    *通过镜像反射扩展图像边界。超出边界的像素值通过对称复制邻近像素得到。
median_image (ImageNoise, ImageMedian, 'circle', 3, 'cyclic')
dev_display (ImageMedian)

(3)-高斯滤波

高斯滤波利用的滤波器不是简单地求均值或者排序,而是调用一个二维离散的高斯函数。
高斯滤波适用于去除高斯噪声。

优点:可以消除高斯噪声

*** 使用高斯滤波步骤
*生成滤波器--->频域的转换--->卷积运算--->逆转换过程
read_image (Image, 'printer_chip/printer_chip_01')
get_image_size (Image, Width, Height)
dev_display (Image)


*第一步生成高斯滤波器
*参数1 生成的高斯滤波器
*参数2 高斯分布在x轴的标准差 典型值100
*参数3 高斯分布在y轴的标准差 典型值100 如果参数2 参数3 值较大的时候会产生更宽的滤波效果,用于
*更强烈的平滑图像
*参数4 高斯滤波器旋转角度 0指的不旋转 
 *建议值:0.0、0.523599、0.785398、1.047198、1.570796、2.094395、2.356194、2.617994、3.141593
*参数5 none 不放大不缩小, 是否对滤波器进行放大或者缩小亮度
*参数6 滤波器的类型
 *'dc_center':直流分量位置在中心 滤波器是圆形的,
 *'dc_edge'  默认值:直流分量位置在在缘
 * 'rft' 生成是一个空域的图片 形状是放射矩形 ,如果用于('rft'),通常选择 'n'。
 *参数7、8 写成图像的宽度和高度
gen_gauss_filter (ImageGauss, 10, 10, 0, 'n', 'rft',  Width, Height)

*频域图片:频域图像是通过傅里叶变换(FFT)将空域图像转成频率空间进行表示
*空域图片:日常看到图像的矩阵,每个像素点描述是亮度和颜色值

*第二步 转成频域图像、
*参数1 要转换的图片
*参数2 转换之后的图片
*参数3 to_freq 从空域图像转成频域图像;from_freq从频域转成空域
*参数4 标准化因子 none 直接输出结果
*参数5 生成图像的格式类型,byte、int1 、real(实数部分)'complex'(实数部分和虚数部分都保留)
*参数6 运行宽度 写成图像的宽度
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)

*第三步 在频域空间进行卷积运算就是使用高斯滤波器
*参数1 频域图像
*参数2 高斯滤波器
*参数3 输出图像
convol_fft (ImageFFT, ImageGauss, ImageConvol)


*第四步 进行逆转换,把经过滤波之后频域图像转成空域图像
*把图像格式进行改成byte格式
rft_generic(ImageConvol, ImageFFT1, 'from_freq', 'none', 'byte', Width)



*俩个图像进行 相减的运算
*1 被减数图片
*2 减数图片
*3 输出图像
*4 矫正因子 1直接输出,0.5将差值缩小一半,2增强差值
*5 矫正值 : 矫正因子*灰度+矫正值 
sub_image (Image, ImageFFT1, ImageSub, 1, 0)


*对象进行缩放
*参数3、4 缩放的比例 如果是0.5 缩小一半
*'constant' 缩放模式(速度快,可能产生锯齿)
zoom_image_factor (ImageSub, ImageZoomed, 0.5, 0.5, 'constant')

*绘制高斯线
*1 输入图像
*2 输出的轮廓
*3 高斯滤波的标准差 控制平滑程度,0.7——20之间,默认值是1.5,值越大检查线越粗
*4 阈值的上限 0-20 默认值3 弱边缘阈值 低于此值将会被忽略
*5 阈值下限  0-35 默认值为8 强边缘阈值,高于此值确定为强边缘
*6 提取线为亮线还是暗线 
*7 是否提取宽度信息
*8 提取线的类型 'bar-shaped' 条形形状 'parabolic' 抛物线
*9 是否在无法添加交汇点地方添加交汇点
lines_gauss (ImageZoomed, Lines, 1.5, 3, 8, 'light', 'true', 'bar-shaped', 'true')

(4)-图形锐化

图像锐化:主要是加强高频成分或削弱低频成分,使图像目标物轮廓和细节更突出。

read_image (Image, 'printer_chip/printer_chip_01')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window_fit_size(0, 0, Width, Width, -1, -1, WindowHandle)
dev_display (Image)

*图像锐化
*参数3
*'sum_abs' 水平梯度和垂直的梯度绝对值和
*sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)

*x 检测垂直线
*sobel_amp (Image, EdgeAmplitude, 'x', 3)

*y 检测水平线
*sobel_amp (Image, EdgeAmplitude, 'y', 3)

*thin_sum_abs 找薄边缘
*sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 3)

*thin_sum_abs 找薄边缘 水平和垂直梯度绝对值大的
*sobel_amp (Image, EdgeAmplitude, 'thin_max_abs', 3)

*平梯度和垂直的梯度和 再开方
sobel_amp (Image, EdgeAmplitude, 'sum_sqrt', 3)
th:=35
threshold (EdgeAmplitude, Region, th, 255)

(5)-图像运算

read_image(Image1, 'bead/adhesive_bead_01.png')
read_image(Image2, 'bead/adhesive_bead_02.png')

* 两个图像相加
* 参数4 乘法系数: 0.5  图像1灰度值+图像2灰度值/2 相当于取平均值
* 参数5 补偿值  写0 不额外调整亮度
   * 大于0 提高整个图像亮度
   * 小于0 降低整个图像亮度
*add_image (Image1, Image2, ImageResult, 0.5, 0)

* (i1灰度值-i2灰度值)*参数4+参数5
*sub_image (Image1, Image2, ImageSub, 1, 128)

*(i1灰度值*i2灰度值)*0.005+0
*mult_image(Image1, Image2, ImageResult, 0.005, 0)

*(il灰度值/i2灰度值)*255+0
div_image (Image1, Image2, ImageResult1, 255, 0)

(6)-高通滤波

 高通滤波: 用于增强边缘和细节,抑制低频信息(平滑区域)

fft_generic参数说明

1. Image(输入参数)
  * 类型:`HObject`(图像对象)
  * 描述:输入的实数图像(单通道灰度图像)。
  * 注意:输入图像必须是实数类型(如 `byte`, `uint2`, `int4`, `real` 等)。
2. **ImageFFT** (输出参数)
  * 类型:`HObject`(图像对象)
  * 描述:输出的复数图像,表示傅里叶变换的结果。
  * 注意:输出图像的像素类型由 `ResultType` 参数决定。
3. **Direction** (输入参数)
  * 类型:`string`
  * 描述:指定傅里叶变换的方向。
    * `"to_freq"`:从空间域转换到频域(正向傅里叶变换)。
    * `"from_freq"`:从频域转换回空间域(逆向傅里叶变换)。
  * 默认值:`"to_freq"`。
4. **Norm** (输入参数)
  * 类型:`string`
  * 描述:指定归一化方式。
    * `"none"`:不进行归一化。
    * `"sqrt"`:对结果进行平方根归一化。
    * `"n"`:对结果进行归一化,除以图像尺寸。
    * `"sqrtn"`:对结果进行平方根归一化,并除以图像尺寸的平方根。
  * 默认值:`"none"`。
5. **Mode** (输入参数)
  * 类型:`string`
  * 描述:指定傅里叶变换的模式。
    * `"dc_center"`:将直流分量(零频分量)放在图像中心。
    * `"dc_edge"`:将直流分量放在图像的左上角。
  * 默认值:`"dc_center"`。
6. **ResultType** (输入参数)
  * 类型:`string`
  * 描述:指定输出图像的像素类型。
    * 支持的像素类型包括:`"complex"`, `"byte"`, `"uint2"`, `"int4"`, `"real"` 等。
  * 默认值:`"complex"`。

read_image (Image, 'printer_chip/printer_chip_01')
get_image_size (Image, Width, Height)
dev_display (Image)

* 过程: 产生一个滤波器--->傅里叶频域转换--->使用卷积运算--->傅里叶逆转换
* 第一步 产生一个高通滤波器
* 参数1 输出高通滤波器图像
* 参数2 截值频率 值越小,保留的高频的成分越多,边缘更突出。值越大,值保留极高频部分
* 参数3 none 不采用归一化
* 参数4 'dc_center' 频域中心模式
* 参数5、6 与图像大小保持一致
gen_highpass (ImageHighpass, 0.1, 'none', 'dc_center', Width, Height)

* 第二步 通过傅里叶进行频域转换
* 参数1 要转换图像
* 参数2 输出图像
* 参数3 to_freq 把空余图像转成频域图像; from_freq:把频域逆转成空域的
* 参数4 转换缩放方式 -1 正向不缩放,逆向缩放,1正向缩放 逆向不缩放; 0 不缩放
* 参数5 使用sqrt 表示缩放因子为1/sqrt(N),N 像素总个数
* 参数6 频域中心模式
* 参数7 图像格式是实数和虚数部分都有
fft_generic(Image, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')

* 第三步 使用卷积进行运算(使用高通滤波)
* 参数1 输入图片
* 参数2 高通滤波器
* 参数3 输出图片
convol_fft (ImageFFT, ImageHighpass, ImageConvol)

* 第四步 傅里叶进行逆转换
* *'real' 实数部分,消除虚部带来的噪声
* 'none' 正向已经使用sqrt,逆向时候尽量不要再去使用sqrt,会导致图像变暗
fft_generic (ImageConvol, ImageFFT1, 'from_freq', -1, 'none', 'dc_center', 'real')

* 如果经过高通滤波之后图像是颠倒的,主要是图像的格式是包含实部和虚部,在进行转换的时候,把实部和虚部也进行颠倒了 导致图像会偏移
* 处理时候可以镜像算子把图像再颠倒过来

* 镜像颠倒的算子
* 参数3 row 进行行坐标进行颠倒
mirror_image (ImageFFT1, ImageMirror, 'row')
* 列颠倒
mirror_image (ImageMirror, ImageMirror1, 'row')
dev_display (ImageMirror1)

(7)-低通滤波

低通滤波: 允许低频成分通过。印制高频成分,能够使图像进行平滑调整

read_image (Image, 'printer_chip/printer_chip_01')
dev_display (Image)
get_image_size (Image, Width, Height)

* 创建一个椒盐噪声
sp_distribution (5, 5, Distribution)
* 将噪声添加到Image上 产生一个带有噪声的图像
add_noise_distribution (Image, ImageNoise, Distribution)

dev_display (ImageNoise)



* 获取一个低通滤波模型
gen_lowpass (ImageLowpass, 0.1, 'none', 'dc_center', Width, Height)


* 对图像进行傅里叶变换到频域图像
fft_generic (ImageNoise, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')

* 对频率图像进行低通滤波
convol_fft (ImageFFT, ImageLowpass, ImageConvol)
* 对的到的频率进行傅里叶变换
fft_generic (ImageConvol, ImageFFT1, 'from_freq', -1, 'sqrt', 'dc_center', 'complex')


噪声分类:

1、椒盐噪声(盐=白色,椒=黑色)

椒盐噪声是数字图像中的常见噪声,一般是由图像传感器、传输信道及解码处理等产生的黑白相见的亮暗点噪声,椒盐噪声常由图像切割产生。椒盐噪声是指两种噪声:盐噪声(salt noise)及椒噪声(pepper noise)。盐噪声一般是白色噪声,椒噪声一般是黑色噪声,前者高灰度噪声,后者属于低灰度噪声,一般两种噪声同时出现,呈现在图像上就是黑白杂点。图像去除脉冲干扰及椒盐噪声最常用的算法是中值滤波,图像模拟添加椒盐噪声是通过随机获取像素值点并设置为高亮点来实现的。

2.随机噪声

随机噪声,又称背景噪声,由时间上随机产生的大量起伏骚扰积累而造成的,其值在给定瞬间内不能预测的噪声。脉冲噪声的特点是无规则。于是本算法基本和椒盐噪声的实现相似,可以控制噪声数量,随机生成黑白杂点,但此黑白杂点也是随机色值(a,b,c)(255-a,255-b,255-c),其中a,b,c是0-30的随机数,这些杂点在图像坐标内随机分布。

3.高斯噪声

高斯噪声是指概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度服从高斯分布,而它的功率谱密度又是分布均匀的,则称它为高斯白噪声。高斯白噪声的二阶矩不想关,一阶矩为常数,是指先后信号在时间上的相关性。高斯白噪声包括热噪声和散粒噪声。高斯噪声完全由其时变平均值和两瞬时的协方差函数来确定,若噪声为平稳的,则平均值与时间无关,而协方差函数则变成仅和所考虑的两瞬时之方差有关的相关函数,它在意义上等效于功率谱密度。高斯噪声可以由大量独立的脉冲产生,从而在任何有限时间间隔内,这些脉冲中的每一个脉冲值与所有脉冲值的总和相比都可以忽略不计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Csharp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值