分享

3、halcon图像预处理:基本变换、滤波和人脸祛斑

 乘舟泛海赏雨 2021-01-02

目录

 

1、图像灰度化

2、图像的滤波

3、图像仿射变换

4、图像的极坐标变换

5、图像的傅里叶变换

6、 案例-人脸去斑


1、图像灰度化

灰度变化的主要目的,是提高图像的对比度。对比度就是图像的清晰程度。包括灰度变换和直方图变换等。

灰度变换分为:灰度线性变换、灰度非线性变换、和灰度直方图变换。

灰度线性变换:将图像的像素点的灰度值按照线性变换函数进行变换。g(x,y)=af(x,y)+b。还可以进行分段变换、取反变换。

图像取反:g(x,y)=255-f(x,y)。

图像相加算子:sub_image

图像取反算子:invert_image

灰度非线性变换:图像灰度值采用非线性函数进行变换,常用的有对数函数和指数函数。

对数函数变换算子:log_image。

指数函数变换算子:exp_image

灰度直方图变换:对图像中的像素灰度做映射变换。这种映射是基于灰度直方图的,这里介绍直方图均衡化。

直方图均衡化算子:equ_histo_image。

程序讲解:

  1. *打开对话框,读取图片
  2. dev_open_file_dialog ('read_image', 'default', 'default', Selection)
  3. *关闭程序变量在变量窗口中显示
  4. dev_update_off ()

F6单步运行。打开对话框,选择要打开的图片

读取图片

  1. *读取,窗口选择的图像
  2. read_image (Image, Selection)

将图像灰度化处理

  1. *将打开的图片灰度化处理
  2. rgb1_to_gray (Image, GrayImage)

*==========================图像线性变换==========================*

将图像线性增强

  1. *图像线性增加,如add_image(a,b,c,k,d),则关系为:c=(a+b)*k+d
  2. add_image (GrayImage, GrayImage, ImageResult, 0.8, 100)

图像的分段,将像素点值设为255,即全白。

  1. *图像的分段-----先获取灰度化后的图片的整个区域
  2. get_domain (GrayImage, Domain)
  3. *图像的分段-----再获得所有的点坐标
  4. get_region_points (Domain, Rows, Columns)
  5. *图像的分段-----再获得图像的灰度值
  6. get_grayval (ImageResult, Rows, Columns, Grayval)
  7. *图像的分段------更改灰度值-------Grayval数组的长度:|Grayval|
  8. for i := 0 to |Grayval|-1 by 1
  9. *灰度值大于100的,将其灰度值改为255,255是全白色,0是全黑色,100灰色
  10. if (Grayval[i]>100)
  11. Grayval[i]:=255
  12. endif
  13. endfor
  14. *图像的分段-----将更改了灰度值后的图片,赋给新的图片
  15. set_grayval (ImageResult, Rows, Columns, Grayval)

*============================非线性变换;常用的有对数和指=============================*

对数函数变换

  1. *对数函数变换,一般提高低范围的像素,降低高范围的像素。提升对比度
  2. log_image (GrayImage, LogImage, 'e')

指数函数变换

  1. *指数函数变换,提高高范围像素,降低低范围像素
  2. exp_image (LogImage, ExpImage, 'e')

*============================直方图均衡化=============================*

equ_histo_image (GrayImage, ImageEquHisto)

2、图像的滤波

图像滤波的作用:去除图像中的干扰(噪声)。噪声一般由外接产生,如灰尘、热噪声等。

滤波主要分为:

均值滤波:  

对于模糊图像以及图像内部的噪声由很好的作用。

算子:mean_image

中值滤波:

对单个噪声点具有很好的平滑作用。特别是椒盐噪声。

算子:median_image 

高斯滤波:

根据高斯函数,考虑权重的滤波。

算子:gauss_filter

导向滤波:

对于边缘具有很好的保持作用,同时能够对其他地方去除噪声,是使用频率较高的去噪方法。

算子:guided_filter

程序讲解:

读取图片

  1. *打开图片
  2. dev_open_file_dialog ('read_image', 'default', 'default', Selection)
  3. read_image (Image, Selection)

均值滤波

  1. *均值滤波-模糊化处理---可以去掉噪点。数值越大越模糊。
  2. mean_image (Image, ImageMean, 20, 20)

中值滤波

  1. *中值滤波-去噪点
  2. median_image (Image, ImageMedian, 'circle', 5, 'mirrored')

增加噪点

  1. *增加噪点
  2. add_noise_white (Image, ImageNoise, 30)

去除噪点

  1. *将增加的噪点去掉
  2. median_image (ImageNoise, ImageMedian1, 'circle', 3, 'mirrored')

高斯滤波

  1. *高斯滤波
  2. gauss_filter (ImageNoise, ImageGauss, 5)

导向滤波

  1. *导向滤波
  2. guided_filter (ImageNoise, ImageGauss, ImageGuided, 3, 20)

 

3、图像仿射变换

图像的变换,包括仿射变化和透视变化。一般情况下用的是仿射变化。图像的仿射变化指的是平移与旋转。

计算图像移动前后矩阵关系:vector_angle_to_rigid

对图像进行变换:affine_trans_image 

程序讲解:

打开图片

  1. *关闭窗口
  2. dev_close_window ()
  3. *打开窗口
  4. dev_open_window (0, 0, 812, 412, 'black', WindowHandle)
  5. *打开图像
  6. dev_open_file_dialog ('read_image', 'default', 'default', Selection)
  7. read_image (Image, Selection)

在打开的图像上裁剪一段,留着后面做旋转

  1. *绘制一个矩形-----鼠标在面板中拖动选择,完成按鼠标右键
  2. draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
  3. *生成矩形----刚刚绘制的矩形
  4. gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
  5. *裁剪---
  6. reduce_domain (Image, Rectangle, ImageReduced)

(鼠标左键在窗口按下上拖动,选择区域。松开鼠标左键,按下鼠标右键,区域选择完成)

计算图像变换的矩阵关系。对裁剪惠普的进行旋转,先计算旋转角度。角度单位是弧度。

  1. *弧度跟角度转换
  2. *tuple_deg (Area, Deg)
  3. *角度转换成弧度----负数是顺时针旋转,正数是逆时针旋转
  4. tuple_rad (45, Rad)
  5. *对图像进行旋转:以矩形的中心旋转。算子前三个参数:旋转之前的行坐标、列坐标、角度(弧度),
  6. *后面三个:旋转以后的中心得行坐标、列坐标、角度(弧度)。最后的,转换结果
  7. vector_angle_to_rigid (Row, Column, 0, Row, Column+100, Rad, HomMat2D)

根据矩阵关系,对图像进行变换操作

  1. *对整图进行移动
  2. affine_trans_image (ImageReduced, ImageAffineTrans, HomMat2D, 'constant', 'false')

对裁剪的区域也进行移动

  1. *对裁切的区域进行移动
  2. affine_trans_region (Rectangle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')

方法2:

  1. *定义一个2D矩阵-------H1
  2. hom_mat2d_identity (H1)
  3. *
  4. area_center (Image, Area1, Row3, Column3)
  5. *对矩阵进行旋转---参数1:要旋转的矩阵,参数2旋转角度(弧度),参数3、4:旋转后的列、行,参数5:旋转后的矩阵
  6. hom_mat2d_rotate (H1, Rad, Column, Row, HomMat2DRotate)
  7. *
  8. affine_trans_image (ImageReduced, ImageAffineTrans1, HomMat2DRotate, 'constant', 'false')

4、图像的极坐标变换

极坐标的定义

在平面内由极点、极轴和极径组成的坐标系。在平面上取定一点O,称为极点。从O出发引一条射线,称为极轴。再取定一个单位长度,通常规定角度取逆时针方向为正。这样,平面上任一点的位置,就可以用r表示线段的长度,a表示角度,r叫做点的极径,a叫做点的极角。有序数对(r,a)就称为P点的极坐标,这样建立的坐标系叫做极坐标系。

极坐标系的变换:选取极坐标原点,并将原坐标系变换为极坐标系的过程,称为极坐标系的变换过程。

关键点在于,极坐标系的原点的选取以及起始角度的设置。

程序讲解:

读取图片

  1. *关闭窗口再新建窗口
  2. dev_close_window ()
  3. dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
  4. *打开文件-图片
  5. dev_open_file_dialog ('read_image', 'default', 'default', Selection)
  6. read_image (Image, Selection)

画圆,并并圆区域的图像裁剪下来

  1. *画圆,并生成
  2. draw_circle (WindowHandle, Row, Column, Radius)
  3. gen_circle (Circle, Row, Column, Radius)
  4. *裁剪,画的圆
  5. reduce_domain (Image, Circle, ImageReduced)

极坐标展开

  1. *极坐标-图形圆展开
  2. polar_trans_image_ext (ImageReduced, PolarTransImage, 256, 256, 0, 6.28319, 0, 100, 512, 512, 'nearest_neighbor')

将展开的极坐标图像再合并起来

  1. *极坐标-图形合并圆
  2. polar_trans_image_inv (PolarTransImage, XYTransImage, 256, 256, 0, 6.28319, 0, 100, 512, 512, 'nearest_neighbor')

5、图像的傅里叶变换

傅里叶变换是时域到频域的变换方法,通俗讲是将现在的空间变换到一个能够反映某些事物出现频率的空间。

图像傅里叶变换:

用途:一般用于对出现频率高的像素点的分析以及噪声的去除。

频率图特点:图像中心为频率0的原点,由内到外频率越来越高。其中,灰度变换激烈的地方对应高频成分,如边缘。灰度变换不大的地方对应低频。

(频率高,指的是图像边缘和噪声)

程序讲解:

读取图片

  1. *打开图片
  2. dev_open_file_dialog ('read_image', 'default', 'default', Selection)
  3. read_image (Image, Selection)
  4. *图像灰度转换
  5. rgb1_to_gray (Image, GrayImage)

傅里叶变换-得到的图片是一个频率分布图

  1. *傅里叶变换-得到的图片是一个频率分布图。原点在中心
  2. *从中间往外,由低到高,中间是低频。高频对应的是边缘变化明显的地方。低频对应外围区域都是灰色的
  3. fft_image (GrayImage, ImageFFT)

傅里叶逆变换

  1. *求傅里叶变换图片的圆心。
  2. area_center (ImageFFT, Area, Row, Column)
  3. *画圆
  4. gen_circle (Circle, Row, Column, 20)
  5. gen_circle (Circle1, Row, Column, 100)
  6. *大圆减小圆,得到的值画圆环
  7. difference (Circle1, Circle1, RegionDifference)
  8. *绘制选中的区域,'fill'填充,0是灰度值,0就就相当于屏蔽掉
  9. *paint_region (Circle, ImageFFT, ImageResult, 0, 'fill')
  10. paint_region (RegionDifference, ImageFFT, ImageResult, 0, 'fill')
  11. *傅里叶逆变换
  12. fft_image_inv (ImageResult, ImageFFTInv)

6、 案例-人脸去斑

原理:人脸祛斑是利用滤波进行去除斑点,一般用的滤波包括双边滤波、各向异性滤波等。

这些滤波和其他滤波原理相似,只是这些滤波考虑了灰度值一信息,不单纯的只考虑距离。

程序讲解:

读取图片

  1. *打开图片
  2. dev_open_file_dialog ('read_image', 'default', 'default', Selection)
  3. read_image (Image, Selection)

使用导向滤波效果

  1. *导向滤波
  2. guided_filter (Image, Image, ImageGuided, 3, 10)

使用双边滤波

  1. *双边滤波
  2. bilateral_filter (Image, Image, ImageBilateral, 3, 20, [], [])

 

样例代码:

  1. *打开图片
  2. dev_open_file_dialog ('read_image', 'default', 'default', Selection)
  3. read_image (Image, Selection)
  4. *均值滤波
  5. *mean_image (Image, ImageMean, 6, 6)
  6. *高斯滤波
  7. *gauss_filter (Image, ImageGauss, 3)
  8. *导向滤波
  9. guided_filter (Image, Image, ImageGuided, 3, 10)
  10. *双边滤波
  11. bilateral_filter (Image, Image, ImageBilateral, 3, 20, [], [])
  12. *各向异性滤波
  13. *anisotropic_diffusion (ImageBilateral, ImageAniso, 'weickert', 5, 1, 10)

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多