Halcon作业NJIT
实现一幅合成图像。对附件中的两幅图像分别进行低通和高通滤波,将滤波后的图像合成为一幅图像。对合成图像进行向下采样,显示不同采样率的合成图像,并说说你的发现。
主要函数有低通滤波器生成函数gen_lowpass(),高通滤波器生成函数gen_highpass(),频域滤波函数convol_fft(),傅立叶变换函数fft_generic()。向下采样函数可以参考作业三的例子程序。
先到百度上下载照片(记得自己的保存路径),代码第一行读图片用到。
*猫
read_image(cat,'C:/Users/cxy/Desktop/机器人视觉课件/机器人视觉作业/task5_cat')
get_image_size(cat,Width, Height)
*低通滤波器生成函数,0.1该滤波阈值可修改,其他的默认
gen_lowpass(Lowpass,0.1,'n','dc_edge',Width,Height)
*傅里叶变换
fft_generic(cat,ImageFFT1,'to_freq',-1,'none','dc_edge','complex')
*低通滤波
convol_fft(ImageFFT1,Lowpass,ImageConvol1)
*傅里逆叶变换
fft_generic(ImageConvol1,ImageResult1,'from_freq',1,'none','dc_edge','byte')
*dev_display (ImageResult1)
get_image_size(cat,Width1, Height1)
*高通滤波器生成函数,0.1该滤波阈值可修改,其他的默认
gen_highpass(Highpass,0.1,'n','dc_edge',Width1,Height1)
*同上
fft_generic(cat,ImageFFT2,'to_freq',-1,'none','dc_edge','complex')
convol_fft(ImageFFT2,Highpass,ImageConvo2)
fft_generic(ImageConvo2,ImageResult2,'from_freq',1,'none','dc_edge','byte')
*dev_display (ImageResult2)
*图像合成
add_image (ImageResult1,ImageResult2,output1,1,0)
get_image_size(output1, WidthCat, HeightCat)
*降采样,0.25均为可修改的参数
zoom_image_factor(output1,ImageZoom,0.25,0.25,'constant')
*狗
read_image(dog,'C:/Users/cxy/Desktop/机器人视觉课件/机器人视觉作业/task5_dog')
get_image_size(dog,Width3, Height3)
gen_lowpass(Lowpass1,0.5,'n','dc_edge',Width3,Height3)
fft_generic(dog,ImageFFT3,'to_freq',-1,'none','dc_edge','complex')
convol_fft(ImageFFT3,Lowpass1,ImageConvol3)
fft_generic(ImageConvol3,ImageResult3,'from_freq',1,'none','dc_edge','byte')
dev_display (ImageResult3)
get_image_size(dog,Width4, Height4)
gen_highpass(Highpass1,0.5,'n','dc_edge',Width4,Height4)
fft_generic(dog,ImageFFT4,'to_freq',-1,'none','dc_edge','complex')
convol_fft(ImageFFT4,Highpass1,ImageConvo4)
fft_generic(ImageConvo4,ImageResult4,'from_freq',1,'none','dc_edge','byte')
dev_display (ImageResult4)
add_image (ImageResult3,ImageResult4,output2,1,0)
*另外一种仿真降采样(仿射变换)课堂例子
*gen_gauss_pyramid()
*hom_mat2d_identity (HomMat2DIdentity)
*hom_mat2d_scale (HomMat2DIdentity, 0.5 , 0.5 , 0, 0, HomMat2DScale)
*affine_trans_image_size (output1, ImageAffineTrans, HomMat2DScale, 'constant', WidthCat, HeightCat)
*dev_display(ImageAffineTrans)
代码分两块,一个是对猫的图像滤波合成,一个是对狗的,两块逻辑几乎一样。注释就只写一半了吧。调参调哪些注释里写了
大体逻辑框架就是:
先读入图像,生成低通滤波器,然后对图像滤波得到图像1
再生成高通滤波器,然后对图像滤波得到图像2
图需1和图像2合成
降采样并观察结果
降采样我代码里写了两种,一种是课堂例子(代码末尾),用仿射变换的方式实现降采样的效果,一种是代码里的缩放函数zoom_image_factor,同样有降采样的效果。
至于说分别滤波后再合成的图像,再进行不同级别的降采样,同时和滤波前的原图进行降采样图像进行比对,个人从肉眼上并没什么直接发现:(
但是通过强大的百度发现,信号与系统的知识中,有着在降采样之前先进行滤波的操作,以免导致信号混叠。(详见https://www.zhihu.com/question/23474073/answer/131643397)
从抽象模型上来看,图像可以看作一种特殊的信号,毕竟每幅图像也有他的频域图,和电路里的信号的区别就是一个在时域,一个在二维空间域里。和电子信号出现混叠一样,图像在降采样之前,如果不进行滤波,降采样之后可能出现一种情况叫做伪影。
消除伪影其实主要还是应用在医学图像或者类似的工业上对图像质量较高的某类图像上。亦或者后期图像需要使用深度学习进行识别时,对图像的纹理特性或者其他某些特性要求较高,这时候也需要先滤波后采样。平时的拍摄的普通风景照片或者人物静物照片的降采样过程中,使用滤波消除伪影的效果在肉眼上并不明显而且难以发现,并且从观赏性角度来看打码之后是否产生伪影区别不大。