Halcon图像和文件操作

文件操作

dev_get_window (WindowHandle)
* 遍历文件夹
list_files ('C:/Users/Desktop/halcon deeplearn/Train_images', ['files', 'recursive'], Files)
* 便利文件夹中的图像文件
list_image_files ('C:/Users/Desktop/halcon deeplearn/Train_images/梨', 'default', [], ImageFiles)
* 筛选bmp及jmp格式的图片配合list_files算子使用
tuple_regexp_select(ImageFiles, ['\\.(bmp|jpg)$','ignore_case'], Files)
* 打开窗口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle1)
* 依次读取所选图片并显示 在窗口中
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    dev_display(Image)
    * 分割文件名    BaseName文件名    Extension文件后缀    Directory文件路径
    parse_filename(ImageFiles[Index], BaseName, Extension, Directory)
    * 保存图片,给出路径及名称,新文件名为在原文件名后添加_adj
    dump_window(WindowHandle,'bmp',Directory + BaseName + '_adj')
    stop ()
endfor

图像读取

read_image (Image, 'printer_chip/printer_chip_02')
read_image (Image1, ['printer_chip/printer_chip_01', 'printer_chip/printer_chip_05'])
** 选择对象中目录    数组索引从1开始
select_obj (Image1, ObjectSelected, 1)
** 统计对象中目录数量
count_obj (Image1, Number)

图像增强 

概念和分类

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

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

1、**空间域法:**包含图像像素的空间,在空间域中,直接对图像进行各种线性或非线性运算,对图像的像素灰度做增强处。分为点运算(作用于像素领域的处理方法,包括灰度变换,直方图修正,伪彩色增强等)和模板处理(作用于像素领域的处理方法,包括平滑,图像锐化等)两大类。

2、**频域法:**在图像的变换域中把图像看作一种二维信号,对其进行基于二维傅里叶变换的信号增强,常用的方法有低通滤波,高通滤波及同态滤波。

灰度变换

灰度变换是根据某种目标条件按一定变换关系逐像素点改变图像中灰度值的方法,也称对比度增强或对比度拉伸。常用的灰度变换方法有:线性灰度变换;分段线性灰度变换;非线性灰度变换。

线性变换算子

反转图像:
invert_image(image输入图像:imageinvert输出图像::)

增强图像对比度:
emphasize(image输入图像:imageemphasize输出图像:maskwidth低通掩膜宽,maskheight低通掩膜高,factor对比度强度:)

原理:首先,该过程使用低通(mean_image)进行过滤。由得到的灰度值(mean)和原始灰度值(orig)计算得到的灰度值(res)如下:

通过参数3、4控制均值滤波模板的大小,数值越大,则图像对比度越强,一般配合参数5—Factor(对比度强度)一起对图像进行增强处理。
作用:增强图像的高频区域(边缘和拐角),使图像看起来更清晰。

缩放图像的灰度值:

scale_image(image输入图像:imagescaled缩放后图像:mult比例因子,add补偿值:)
1、扩展动态范围:当mult>1时,结果会使图像灰度取值的动态范围展宽,图像对比度增大,可以改善曝光不足的缺陷,或充分利用图像显示设备的动态范围
2、改变取值空间:当mult=1时,变化后灰度动态范围不变,灰度取值区间会随a和c的大小而上下平移,效果是使整个图像更暗或更亮
3、缩小动态范围:当0<mult<1,则变换后图像动态范围会变窄,图像对比度变小
4、反转或取反:当mult<0,则变化后图像的灰度值会反转,即图像中亮的变暗,暗的变量;当mult=-1时,输出图像为输入图像的底片效果

*读取图像
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)
*保存图像
dump_window (WindowHandle, 'bmp', 'halcon_dump')

*图像取反    255-当前灰度值
invert_image (Image, ImageInvert)

*增加对比度
emphasize (ImageInvert, ImageEmphasize, Width, Height, 1)

 

*减小对比度
scale_image (ImageInvert, ImageScaled, 0.5, 0)

 

*增加亮度
scale_image (ImageInvert, ImageScaled1, 1, 100)

 

*减小亮度
scale_image (ImageInvert, ImageScaled2, 1, -100)

 

分段线性灰度变换算子

确定区域内的最小和最大灰度值

min_max_gray(regions需要计算的区域,image输入的图像::percent低于或高于绝对最大值或最低值的百分比:min最小灰度值,max最大灰度值,range最大最小的差值)

最大灰度值在取值范围为0到255之间展开

scale_image_max(image输入图像:imagscalemax增强后图像::)

*读取图像
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)
*得到最大和最小灰度值
min_max_gray (Image, Image, 0, Min, Max, Range)
*扩展灰度范围
scale_image_max (Image, ImageScaleMax)
*保存图像
write_image (ImageScaleMax, 'bmp', 0, 'C:/Users/Desktop/halcon deeplearn/dddd.bmp')

 

非线性灰度变换

对数变换:可以扩张数值较小的灰度范围或者压缩数值较大的灰度范围;是一种有用的非线性映射交换函数,用于扩展输入图像中范围较窄的低灰度像素,压缩输入图像中范围较宽的高灰度像素,使原本低灰度值的像素部分更好的呈现。

对图像进行对数变换

log_image(image输入图像:logimage变换后的图像:base对数的底数:)

指数变换:可以有选择性的增强低灰度区域的对比度或高灰度区域的对比度。

对图像进行指数变换

pow_image(Image输入图像:powimage变换后图像:exponent指数:)

*读取图像
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)
** 对数变换
log_image (Image, LogImage,2)
** 指数变换
pow_image (Image, PowImage, 3)

直方图

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

直方图特征:
1、没有位置信息
2、与图像之间为一对多的映射关系,任意一幅图像都有唯一确定的一个直方图与之对应,但不同的图像可能有相同的直方图

3、可叠加性,各个子区域之和等于该图像全图的直方图

相关算子

gray_histo(regions需要计算的区域,image输入的图像:::absolutehisto绝对分布,relativehisto相对分布)

得到直方图:

gen_reigon_histo(:region需要输入的区域:histogram灰度分布,row直方图中心行坐标,column直方图中心列坐标,scale直方图比例:)

*方法一
*读取图像
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)
*点击菜单栏的“灰度直方图”按钮,得到结果
 
*方法二
*读取图像
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)
*计算图像的灰度值分布
gray_histo(Image, Image, AbsoluteHisto, RelativeHisto)
*获得灰度直方图
gen_region_histo (Region, AbsoluteHisto, 255, 255, 1)

直方图均衡

直方图均衡化:把原始图像的直方图变换为均匀分布的形式,增加像素灰度值的动态范围。即是使原图像中具有相近灰度且占有大量像素点的区域的灰度范围展宽,使大区域中的微小灰度变化显现出来,增强图像整体对比对效果,使图像更加清晰。

equ_histo_image(image输入图像:imageequhisto均衡后的图像::)

直方图规范化:通过一个灰度映射函数,将原灰度直方图改造成所希望的特定形状直方图。

*读取图像
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)
equ_histo_image (Image, ImageEquHisto)

图像平滑或者滤波

滤波原理:

图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。

图像滤波的主要目的:为了消除图像中混入的噪声,并且为图像识别抽取出图像特征。 滤波处理的要求:一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。

空域平滑法
1、领域平均法:进行运算的结果不仅跟本像素点灰度值有关,和其他周围的像素点的灰度值有关。核心思想为选择一个子图像(邻域),用该领域里所有像素灰度的平均值去替换领域中心像素的灰度值。平滑效果与所用的邻域半径有关,半径越大,图像模糊程度越大。
2、加权平均法:加权平均与邻域平均类似,区别在于加权平均的每个点对于平均数的贡献并不相等。
3、多图像平均法:在相同条件下采集同一目标物的若干幅图像,然后通过采集到的多幅图像进行平均的方法来消减随机噪声。

噪声分类:

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

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

2.随机噪声

随机噪声,又称背景噪声,由时间上随机产生的大量起伏骚扰积累而造成的,其值在给定瞬间内不能预测的噪声。说实话没大理解,后来在老师的ppt课件上发现了随机值脉冲噪声,感觉它的效果和椒盐噪声很像。又百度了一下,发现脉冲噪声的特点是无规则。于是本算法基本和椒盐噪声的实现相似,可以控制噪声数量,随机生成黑白杂点,但此黑白杂点也是随机色值(a,b,c)(255-a,255-b,255-c),其中a,b,c是0-30的随机数,这些杂点在图像坐标内随机分布。

3.高斯噪声

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

均值滤波

均值滤波是一种线性滤波器,即将一个窗口区域中的像素计算平均值,然后将窗口中计算得到的均值设置为锚点上的像素值。 均值滤波是对所有输入图像(图像)的灰度值进行线性平滑。过滤器矩阵由1(计算相等)和大小Mask Height x Mask Width。卷积的结果除以掩码高度x掩码宽度。对于边界处理,将灰度值反射到图像边缘。 均值滤波中的任意一点的像素值,都是周围N/times M个像素的均值。

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

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

mean_image(image需要滤波的图像:imagemean滤波后的图像:maskwidth掩膜宽度,maskheight掩膜高度:)

*读取图像
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)
*获得一个高斯噪声分布    黑点干扰
gauss_distribution (20, Distribution)
*将高斯噪声添加到图像
add_noise_distribution (Image, ImageNoise, Distribution)
*将噪声图像进行均值滤波    与原图对比清晰度下降
mean_image (ImageNoise, ImageMean,9, 9)

中值滤波

中值滤波是一种非线性滤波,在处理脉冲噪声以及椒盐噪声时效果极佳,能够有效的保护好图像的边缘信息。

中值滤波的基本原理是让图像中某点临近的像素按照大小排序,取排序像素集中位于中间位置的值作为中值滤波后的像素值。换句话说,可以理解为一个窗口沿着图像移动,然后将把窗口中所含的像素点按灰度级的升或降序排列,用位于中间的灰度值来代替该点的灰度值。

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

 median_image(image输入图像:imagemedian滤波后图像:masktype掩膜类型,radius掩膜尺寸,margin边界处理:)

*读取图像
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)
*获得椒盐噪声分布    白点干扰
sp_distribution (5, 5, Distribution)
*添加椒盐噪声到图像
add_noise_distribution (Image, ImageNoise, Distribution)
*对噪声进行中值滤波
median_image (ImageNoise, ImageMedian, 'circle', 3, 'mirrored')

高斯滤波

高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。 高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。 图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值。

优点:可以消除高斯噪声

频域低通滤波

低通滤波:抑制高频域;高通滤波:抑制低频域。

一幅图像中灰度均匀的平滑区域对于傅里叶变换中的低频成分,灰度变换频繁的边缘及细节对应傅里叶变换中的高频成分。

低通滤波器:

  1. 理想低通滤波器
  2. 巴特沃斯低通滤波器
  3. 指数低通滤波器
  4. 梯形低通滤波

生成理想的低通滤波图像:
gen_lowpass(:imagelowpass生成的滤波图像:frequency截止频率,norm滤波器归一化引子,mode频率图中心位置,width,height生成滤波图像的宽高:)

快速傅里叶变换:
fft_generic(image输入图像:imageFFT变换后图像:direction变换的方向,频域到空域还是空域到频域,exponent指数的符号,norm变换的归一化因子,mode DC在频率域中的位置,resulttype变换后图像类型)

频域里卷积图像:
convol_fft(imageFFT频域图像,imagefilter滤波器:imageconvol卷积后图像::)

*读取图像
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)
*获得椒盐噪声分布
sp_distribution (5, 5, Distribution)
*添加椒盐噪声到图像
add_noise_distribution (Image, ImageNoise, Distribution)
*获得一个低通滤波模型
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, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')

图像质量不理想、提取线条效果不好时

*读取图像
read_image (Image, 'printer_chip/printer_chip_01')
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')

 

图像锐化

从频域分析,图像的低频成分主要对应于图像中的区域和背景,高频成分主要对应于图像的边缘和细节;

图像模糊的实质是表示目标物轮廓和细节的高频分量被衰减,因而在频域可采用高频提升滤波的方法来增强图像。

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

一阶微分算子法:

  1. 梯度法
  2. Sobel算子

利用Sobl算子边缘检测
sobel_amp(image输入图像:edgeamplitude边缘梯度图像:filtertype过滤类型,size掩模尺寸:)

*读取图像
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)
*对图像进行sobel算子处理    那个效果好就用那个
sobel_amp (Image, EdgeAmplitude, 'y', 3)
sobel_amp (Image, EdgeAmplitude, 'x', 3)
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
sobel_amp (Image, EdgeAmplitude, 'sum_sqrt', 3)
sobel_amp (Image, EdgeAmplitude, 'sum_sqrt_binomial', 3)
sobel_amp (Image, EdgeAmplitude, 'x_binomial', 3)
sobel_amp (Image, EdgeAmplitude, 'y_binomial', 3)
sobel_amp (Image, EdgeAmplitude, 'sum_abs_binomial', 3)
*掩模越大,图像越暗,忽略的细节越多;掩模越小,凸显的细节越多
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 5)
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 7)
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 9)
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 11)

 

用有限差分计算拉普拉斯算子

laplace(image输入图像:imagelaplace拉普拉斯滤波结果图像:resulttype图像类型,masksize掩膜尺寸,filtermask拉普拉斯掩膜类型:)

高通滤波法:

  1. 理想高通滤波器
  2. 巴特沃斯高通滤波器
  3. 指数高通滤波器
  4. 梯形高通滤波器

生成理想高通滤波:

gen_highpass(:imagehighpass生成的滤波器图像:frequency截止频率,norm滤波器归一化引子,mode频率图中心位置,width,height生成滤波图像宽高:)

*读取图像
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)
*得到高通滤波模型
gen_highpass (ImageHighpass, 0.1, 'none', 'dc_center', Width, Height)
*对图像进行傅里叶变换
fft_generic (Image, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
*对频率图像进行高通滤波    忽略细节
convol_fft (ImageFFT, ImageHighpass, ImageConvol)
*对得到的频率进行傅里叶反变换
fft_generic (ImageConvol, ImageFFT1, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')

图像减法

g':=g1*g2*Mult+Add

mult_image(Image1, Image2 : ImageResult : Mult, Add : )

*图二
mult_image (Image, Image, ImageResult, 0.05, 1)
*图三
mult_image (Image, Image, ImageResult, 0.003, 100)

仿射变换

怎么计算仿射变换

仿射变换矩阵为2*3的矩阵,**第三列的元素起着平移的作用,前面两列的数字对角线上是缩放,其余为旋转或者斜切的作用** - 计算仿射矩阵只需要3对不共线的点

定义

指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间

仿射变换的实际意义

  • 仿射变换在图形中的变换包括:平移、缩放、旋转、斜切(将斜体字导正)

  • 性质
  • 凸性
  • 共线性:若几个点变换前在一条直线上,仿射变换后仍然在一条直线上
  • 平行性:若两条线变换前平行,那变换后仍然平行
  • 共线比例不变性:在一条线上,两线段的比例,仿射变换后保持不变

平移变换

缩放变换

旋转变换

斜切变换

刚体运动:旋转缩放平移

仿射变换流程

要进行仿射变换,必须先获取变换矩阵。要获取变换矩阵,必须先获取特征点坐标、角度等信息,几何匹配和bolb分析是获取特征点的高效方法

创建一个初始化矩阵 [1 0 0 0 1 0 0 0 1]

生成单位矩阵,对角线为1,相等于自然数1 - 单位矩阵乘以任何矩阵都等于这个矩阵本身

 // 产生仿射变换矩阵
 hom_mat2d_identity(:::HomMat2DIdentity)

在初始化矩阵的基础上,使用各种变换形式(平移、缩放、旋转)生成仿射变换矩阵

 // 把旋转角度添加到仿射变换矩阵
 hom_mat2d_rotate(HomMat2D, // 输入仿射变换矩阵(等于给了一个原始矩阵位置)
                  Phi, // 输入旋转角度(弧度制)
                  Px,Py, // 变换的参考点(围绕该点进行旋转)
                  HomMat2DRotate) // 输出旋转变换矩阵
 ​
 // 把缩放添加到仿射变换矩阵
 hom_mat2d_scale(HomMat2D,
                 Sx,Sy, // x,y轴缩放比例
                 Px,Py, // 变换的参考点(围绕该点进行缩放)
                 HomMat2DScale) // 输出缩放变换矩阵
     
 // 把平移添加到仿射变换矩阵
 hom_mat2d_translate(HomMat2D,
                     Tx,Ty, // 沿x轴、y轴方向平移的距离
                     HomMat2DTranslate) // 输出平移矩阵
 ​
 // 把斜切添加到仿射变换矩阵
 hom_mat2d_slant(HomMat2D,
                 Theta, // 输入斜切角度(弧度制)
                 Axis, // 输入斜切的坐标轴。取值列表:x,y
                 Px,Py,
                 HomMat2DSlant) // 输出斜切变换矩阵
计算已知点运动后的仿射矩阵

 // 根据两个以上点对计算刚性仿射变换矩阵,支持旋转和平移
 ​
 // 求平移或旋转矩阵
 vector_angle_to_rigid(Px,Py, // 区域变换之前中心点的坐标
                       Phi, // 夹角(极轴水平向右的夹角始边 逆时针为正 顺时针为负)
                       Qx,Qy, // 区域变换之后的坐标
                       Phi1, // 变换之后的角度
                       HomMat2D) // 输出仿射变换矩阵
 ​
 vector_to_rigid(Px,Py, // 输入原始点组的x、y坐标
                 Qx,Qy, // 输入变换后点组的x、y坐标
                 HomMat2D) // 输出仿射变换矩阵
 ​
 // 根据两个以上点对计算相似仿射变换矩阵,支持旋转、平移和缩放
 vector_to_similarity(::Px,Py,Qx,Qy:HomMat2D)
    
 // 根据三个以上点对计算仿射变换矩阵,支持旋转、平移、缩放、斜切
 vector_to_hom_mat2d(::Px,Py,Qx,Qy:HomMat2D)

根据生成的变换矩阵执行仿射变换,对图像、区域、轮廓进行仿射变换

执行仿射变换的算子

 // 对XLD轮廓进行二维仿射变换,支持缩放,旋转,平移,斜切
 affine_trans_contour_xld(Contours, // 输入XLD轮廓
                          ContoursAffinTrans, // 输出变换的XLD轮廓
                          HomMat2D) // 输入仿射变换矩阵
 ​
 // 对图像轮廓进行二维仿射变换,支持缩放、旋转、平移,斜切
 affine_trans_image(Image, // 输入图像
                    ImageAffinTrans, // 输出变换后的图像
                    HomMat2D,
                    Interpolation, // 插值算法。参数值列表: nearest_neighbor,bilinear,constant,weighted
                    AdaptImageSize) // 结果图像尺寸是否自适应。默认值:false
 ​
 // 对区域进行任意二维仿射变换
 affine_trans_region(Region, // 输入区域
                     RegionAffineTrans, // 输出变换后的区域
                     HomMat2D, // 得到的矩阵变量
                     Interpolate) // 插值算法。默认值:nearest_neighbor。参数值列表:constant,nearest_neighbor
 ​
 // 对XLD多边形进行任意二维仿射变换
 affine_trans_polygon_xld(Polygon, // 输入XLD多边形
                          PolygonsAffinTrans, // 输出变换后的XLD多边形
                          HomMat2D)
 ​
 // 对点进行任意二维仿射变换,支持缩放、旋转、平移、斜切
 affine_trans_point_2d(HomMat2D,
                       Px,Py, // 原始点x或行坐标
                       Qx,Qy) // 变换点x或行坐标
 ​
 // 对像素进行任意二维仿射变换
 affine_trans_pixel(HomMat2D,
                    Row,Col, // 输入像素坐标
                    RowTrans,ColTrans) // 输出的变换像素坐标

计算仿射变换参数

// 根据仿射变换矩阵(齐次二维变换矩阵)计算仿射变换参数
 hom_mat2d_to_affine_par(HomMat2D,
                         Sx,Sy, // x、y方向的缩放因子(如果从图像空间变换到物理空间,就是x、y方向的 像素单量)
                         Phi, // 旋转角度
                         Theta, // 斜切角度
                         Tx,Ty) // 沿x、y方向平移的距离

仿射变换的应用

Halcon中的仿射变换常用的两种方式:旋转以及缩放(当然平移也常用,但是不属于仿射变换) - 变换涉及到三个量,一个是待变换的图像或者矩阵,一个变换矩阵,以及变换后的图像或者矩阵

在Halcon中会有两种运用方式。第一种:已知待变换的图像,变换矩阵,求变换后的图像 - 第二种:已知待变换的图像,变换后的图像,求变换矩阵

dev_get_window (WindowHandle)
read_image (Image, '../affine.jpg')
*阈值切割
threshold (Image, Region, 0, 200)
*分割不联通区域
opening_circle (Region, Region, 1.5)
*面积赛选
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
*得到变换的中心点
area_center (SelectedRegions, Area, Row, Column)
dev_set_draw ('margin')

*hom_mat2d_translate中的两个参数的意思是:Tx和Ty分别代表Row方向和Column方向的平移量
dev_display (Image)
*显示十字叉
disp_cross (WindowHandle, Row, Column, 10, 40)

*创建空的齐次矩阵
hom_mat2d_identity (HomMat2DIdentity)

*建立平移矩阵    以图像左上角原点进行偏移
hom_mat2d_translate (HomMat2DIdentity,30, 150, HomMat2DTranslate)
affine_trans_region (Region, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')

 

*hom_mat2d_rotate中的三个参数的意思是:旋转角度(逆时针为正,弧度制),旋转中心的row和column值
dev_display (Image)
*获取区域中心
disp_cross (WindowHandle, Row, Column, 10, 40)
*建立旋转变换矩阵
hom_mat2d_rotate (HomMat2DIdentity, rad(60), Row, Column, HomMat2DRotate)
affine_trans_region (Region, RegionAffineTrans1, HomMat2DRotate, 'nearest_neighbor')

 

*hom_mat2d_scale中的四个参数的意思是:Sx和Sy分别代表Row方向和Column方向的缩放系数,缩放中心的row和column值
dev_display (Image)
disp_cross (WindowHandle, Row, Column, 10, 40)
*建立缩放变换矩阵
hom_mat2d_scale (HomMat2DIdentity, 2.0, 2.0, Row, Column, HomMat2DScale)
affine_trans_region (Region, RegionAffineTrans3, HomMat2DScale, 'nearest_neighbor')

 


* 有时候,并不需要创建初始化矩阵也可以执行仿射变换,例如vector_angle_to_rigid算子就是如此。
* vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)
Row := 100
Column := 200
dev_display (Image)
for Index := 1 to 150 by 1  
    vector_angle_to_rigid (Row, Column, 0, Row, Column, rad(10), HomMat2D)
    disp_cross (WindowHandle, 100, 200, 10, 40)
    affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'nearest_neighbor', 'false')
    copy_image (ImageAffinTrans, Image) 
endfor

 

posted @ 2024-07-01 00:37  ZHIZRL  阅读(6)  评论(0编辑  收藏  举报