HALCON学习笔记(三)——图像运算

图像运算:以图像为单位进行的操作(该操作对图像中的所有像素同时进行),运算的结果是得到一幅灰度分布与原图灰度分布不同的新图像。具体的运算包括算术逻辑运算,通过改变像素的值达到图像增强的效果。

图像的代数运算

图像的代数运算也称像元运算,将多幅图像之间的像元一一对应并做相应的加减乘除算法。

  1. 加法运算:可用于图像的合成;降低图像的随机噪声。该方法需保证噪声之外的图像运算前后是不变的。
  2. 减法运算:检测多幅图像之间的变化;也可以把目标从背景中分离出来。
  3. 乘法运算:提取局部区域,通过掩模运算,将二值图像和原图做乘法运算可实现局部提取。
  4. 除法运算:校正阴影,实现归一化。

加法在去除噪点中的作用例程:

*读取图像
read_image (Image, '1')
*将三通道转为灰度图
rgb_to_gray(image,gimage)
*得到图像大小
get_image_size (Image, Width, Height)
*生成同样大小的空图像,灰度值默认为0
gen_image_const (Image1, 'byte', Width, Height)
*循环生成十幅白噪声图
for i:=1 to 10 by 1
*增加图像的白噪声,参数根据噪点尺寸决定
    add_noise_white (Image, ImageNoise, 90)
*图像灰度值除10(因为上限255)
    scale_image (ImageNoise, ImageNoise, 0.1, 0)
*白噪声图和空图像相加
    add_image (ImageNoise, Image1, Image1, 1,0)
endfor
*对生成的10幅图像求平均值
scale_image (Image, ImageScaled, 1, 0) 

加法在图像合成中的例程:

*读取图像1,2
read_image(image1,'1')
read_image(image2,'2')
*保证两幅图像大小相同
crop_part(image1,imagepart1,0,0,512,480)
crop_part(image1,imagepart2,0,0,512,480)
*打开具有给定最小和最大范围的新图形窗口,保留给定图像的横纵比
dev_open_window_fit_image(imagepart1,0,0,-1,-1,windowid)
*显示文字字体设置
set_display_font(windowid,16,'momo','true','false')
*显示图片
dev_display(imagepart1)
*显示文字
disp_message(windowid,'image1','window',12,12,'black','true')
*显示单击运行继续
disp_continue_message(windowid,'black','true')
stop()
*显示图片
disp_message(windowid,'image2','window',12,12,'black','true')
disp_continue_message(windowid,'black','true')
stop()
*两幅图片通过加法运算合并
add_image(imagepart1.imagepart2,imageresult,0.5,0)
*显示最终图片
dev_display(imageresult)

图像减法例程:

*关闭窗口
dev_close_window()
*关闭窗口更新
dev_update_off()
*读取两幅图像
read_image(image1,'1')
read_image(image2,'2')
*数据类型转为整型
convert_image_type(image1,imageconvert1,'int2')
convert_image_type(image2,imageconvert2,'int2')
dev_open_window_fit_image(inmageconvert1,0,0,-1,-1,windowid)
set_display_font(windowid,16,'momo','true','false')
dev_display(imageconvert1)
disp_message(windowid,'image1','window',12,12,'black','true')
disp_continue_message(windowid,'black','true')
stop()
dev_display(imageconvert2)
disp_message(windowid,'image2','window',12,12,'black','true')
disp_continue_message(windowid,'black','true')
stop()
sub_image(imageconvert1,imageconvert2,imagesub,1,0)
dev_display(imagesub)
disp_message(windowid,'resulting image of the sub','windowid',12,12,'black','true')

图像乘法:

read_image(image1,'1')
read_image(image2,'2')
mult_image(image1,image2,image,0.005,0)

图像除法:

read_image(image1,'1')
read_image(image2,'2')
div_image(image1,image2,image,255,0)

图像逻辑运算:

read_image(image1,'1')
read_image(image2,'2')
bit_and(image1,image2,imageand)
bit_or(image1,image2,imageor)
bit_xor(image1,image2,imagexor)
bit_not(image1,image2,imagenot)
bit_lshift(image1,image2,imagel)
bit_rshift(image1,image2,imager)

图像的几何变换

仿射变换:

affine__trans_image(image原图:imageaffintrans变换后的图像:hommmat2d变换矩阵,interpolation插值方法,adaotimagesize自动调节输出图像的大小:)

定义变换矩阵:

hom_mat2d_identity(:::HomMat2DIdentity单位矩阵

在2D齐次仿射变换中增加平移变换:

hom_mat2d_translate(::HomMat2D,Tx,Ty 行列的平移量:HomMat2DTranslate)

在2D齐次仿射变换中增加缩放变换:

hom_mat2d_scale(::HomMat2D,Sx,Sy 缩放倍数,Px,Py 基准点,此点固定不变:HomMat2DScale)

在2D齐次仿射变换中增加旋转变换:

hom_mat2d_rotate(::HomMat2D,Phi 旋转角度,Px,Py 旋转基准点:HomMat2DRotate)

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_set_color ('black')
*窗口中画出reigon区域
draw_region (Region, WindowHandle)
*定义仿射变换矩阵
hom_mat2d_identity (HomMat2DIdentity)
*在齐次仿射变换矩阵中增加旋转变换
hom_mat2d_rotate (HomMat2DIdentity, rad(phi), 256, 256, HomMat2DRotate)
*在齐次仿射变换矩阵中增加缩放变换
hom_mat2d_scale (HomMat2DRotate, 2, 2, 256, 256, HomMat2DScale)
*在齐次仿射变换矩阵中增加平移变换
hom_mat2d_translate (HomMat2DScale, 64, 64, HomMat2DTranslate)
*针对region做仿射变换
affine_trans_region (Region, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')
dev_clear_window ()
dev_set_draw ('margin')
dev_set_color ('red')
dev_display (Region)
dev_set_color ('green')
dev_display (RegionAffineTrans)

确定投影变换矩阵:

hom_vector_to_proj_hom_mat2(::Px,Py,Pw,Qx,Qy,Qw,Method:HomMat2D)

常用的灰度值差值方法:

  1. 最近邻插值法:也称零阶插值,令变换后像素的灰度值等于距他最近的输入像素的灰度值
  2. 双线性插值法:也称一阶插值,沿图像矩阵的每一列进行插值,然后对插值后所得的矩阵再沿行列方向进行线性插值
  3. 卷积插值法:在输入图形的两行列中插入零值,然后通过低通模板滤波便可得到插值后的图像
dev_update_window ('off')
dev_update_var ('off')
dev_update_time ('off')
dev_update_pc ('off')
dev_set_color ('red')
read_image(Image, '1')
*阈值分割获得region
threshold (Image, Region, 128, 255)
*消除小区域并平滑区域的边界
opening_circle (Region, RegionOpening, 3.5)
hom_mat2d_identity (HomMat2DIdentity)
scale:=1
for phi:=0 to 360 by 1
    *针对图像做仿射变换,这里选择的是最近邻插值法
    hom_mat2d_rotate (HomMat2DIdentity, rad(phi), 256, 256, HomMat2DRotate)
    hom_mat2d_scale (HomMat2DRotate, 2, 2, 256, 256, HomMat2DScale)
    affine_trans_image (Image, ImageAffineTrans, HomMat2DScale, 'constant', 'false')
    affine_trans_region (RegionOpening, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')
    dev_display (ImageAffineTrans)
    dev_display (RegionAffineTrans)
    scale:=scale/1.005
endfor
dev_update_pc ('on')
dev_update_time ('on')
dev_update_var ('on')
dev_update_window ('on')

基于HALCON的图像校正

使用仿射变换和投影变换实现图像旋转90度:

read_image (Image, 'printer_chip/printer_chip_01')
*基于仿射变换的实现方法
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_rotate (HomMat2DIdentity, rad(90), 256, 256, HomMat2DRotate)
affine_trans_image (Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')
*基于投影变换的实现方法
hom_vector_to_proj_hom_mat2d ([0,0,512,512], [0,512,512,0], [1,1,1,1], [0,512,512,0], [512,512,512,0], [1,1,1,1], 'dlt', HomMat2D)

投影畸变的产生及基于投影变换的图像校正:

read_image (Image, 'printer_chip/printer_chip_01')
*进行一系列的旋转变换,产生三维仿射变换矩阵
hom_mat3d_identity (HomMat3DIdentity)
hom_mat3d_rotate (HomMat3DIdentity,rad(Gamma), 'z', row, column, focus, HomMat3DRotate)
hom_mat3d_rotate (HomMat3DIdentity,rad(Beta), 'x', row, column, focus, HomMat3DRotate)
hom_mat3d_rotate (HomMat3DIdentity,rad(Alpha), 'y', row, column, focus, HomMat3DRotate)
*把三维仿射变换矩阵转化为投影变换矩阵
hom_mat3d_project (HomMat3DRotate, row, column, focus,HomMat2D)
*进行投影变换
projective_trans_image (Image, TransImage, HomMat2D, 'bilinear', 'false', 'false')

完整例程:

dev_update_off ()
dev_close_window ()
read_image (Image, 'printer_chip/printer_chip_01')
*打开合适图片的窗口
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_set_color ('white')
dev_set_line_width (3)
stop()
Xcoordcorners:=[130,225,290,63]
Ycoordcorners:=[101,96,289,269]
*为每个输入点生成十字形状的XLD轮廓
gen_cross_contour_xld (Cross, Ycoordcorners, Ycoordcorners, 6, 0.785398)
dev_display (Image)
dev_display (Cross)
stop()
hom_vector_to_proj_hom_mat2d (Xcoordcorners, Ycoordcorners,[1,1,1,1],[70,270,270,70],[100,100,300,300],[1,1,1,1], 'normalized_dlt', HomMat2D)
*在待处理的图像上应用投影变换矩阵
projective_trans_image (Image, TransImage, HomMat2D, 'bilinear', 'false', 'false')
*为上述2D数据代码创建模型
create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle)
*检测输入图像中的2D数据模型代码
find_data_code_2d (TransImage, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
dev_display (Image)
dev_display (TransImage)
dev_display (SymbolXLDs)
disp_message (WindowHandle, DecodedDataStrings, 'window', 12, 12, 'black', 'true')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
disp_message (WindowHandle, DecodedDataStrings, 'window', 12, 12, 'black', 'true')
clear_data_code_2d_model (DataCodeHandle)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值