一、实验原理

本次实验的原理来源于由Oliva、Torralba和 Schyns 在2006年发明并在SIGGRAPH上发表了的论文 Hybrid images。该论文提出混合图像是基于人类视觉系统对图像的多尺度处理,由视觉掩蔽研究驱动的。这些图像可用于创建引人注目的显示,其中图像在不同的距离有不同的感知。通过滤波分离图像的高频和低频,将不同图像的高频和低频合并以创建相关尺度的图像。

二、实验目的

本实验要求实现一个图像滤波函数,对于给定的两幅图像,得到第一幅图像的高频信息,即细节信息;得到另外一幅图像的低频信息,即大概轮廓信息;然后进行混合得到混合图像,从远处与近处分别看混合后的图像会看到不同的效果(实验提供了5对对齐的图像)。

三、实验内容

这次实验的内容调用五个.py文件完成,分别是my_imfilter.py文件、gauss2D.py文件、proj1.py文件、basiccontrasttest.py文件以及proj1_test_filtering.py文件。下面将进行详细的描述。

1、my_imfilter.py文件

文件中只包含一个my_imfilter()函数,功能是在对于彩色图像(即三通道RGB图像)进行处理时,应该分别对每一个通道分别进行滤波处理。函数的输入是待处理的图像和3*3的滤波器,输出是滤波出来后的图像。这部分的主要内容有:

(1)通过numpy的shape函数得图像和滤波器的尺寸。

(2)为了避免因为卷积运算导致输出图像缩小和图像边缘信息丢失,常常采用图像边缘填充技术,即在图像四周边缘填充0,使得卷积运算后图像大小不会缩小,同时也不会丢失边缘和角落的信息。

(3)使用numpy的zero函数初始化填充数组为0,并把填充数组和原始图像相结合。

(4)进行卷积操作,过滤器从图像的最左上角像素移动到最右下角像素。

2、gauss2D.py文件

文件中只包含一个gauss2D()函数,是二维高斯掩模,通过模糊去除图像1中的高频。

3、proj1.py文件

文件中只包含五个函数,normalize()函数的功能是归一化;setup_image()函数的功能是读取图像并转换为浮点格式;gen_hybrid_image()函数的功能是使用滤波器得到第一张图像的低通滤波和第二张图像的高通滤波并加以混合;vis_hybrid_image()函数的功能是通过逐步向下采样图像并将所有图像连接在一起,来可视化混合图像;save_image()函数的功能是(可视化和)保存输出。

(1)对于不齐的一对图像,我们应该调整高斯模糊像素的标准差来进行对齐,然后对输入数组进行归一化。

这里我们用的图相对分别为

(2)读取图像,转换为浮点格式。

(3)使用滤波器得到第一张图像的低通滤波和第二张图像的高通滤波并加以混合,输入参数为一对图和高斯模糊函数的标准差,其中图一用来提供低通滤波,图二用来提供高通滤波。输出参数为通过图一得到的低通滤波图、通过图二得到的高通滤波图以及图一得到的低通滤波和图二得到的高通滤波的混合图。

(4)通过逐步向下采样图像并将所有图像连接在一起,来可视化混合图像。

(5)保存输出。

(6)按照项目要求进行输出图像的保存操作。

4、basiccontrasttest.py文件

basiccontrasttest.py文件用来测试函数,以猫的图像为例。

5、proj1_test_filtering.py文件

proj1_test_filtering.py文件用来测试my_imfilter()函数,在使用过滤器构造proj1.py文件中的混合图像之前,应该验证一下是否得到了合理的输出,这里所有输出都被保存。还是以猫的图像为例。

(1)将输入图像进行归一化处理,并对图像进行设置。

(2)确定滤波器,此时的滤波器不执行任何操作,打印出的图像和原图一样。

(3)使用新的滤波器blur_filter,这个滤波器应该会去除一些高频信息。

(4)使用另一个滤波器large_2d_blur_filter,该滤波器将在使用gauss2D()函数的基础上使用my_imfilter()函数,在每个方向上进行了模糊。

(5)定义了一个新的滤波器sobel_filter,使用Sobel算子。

(6)定义了一个新的离散拉普拉斯滤波器laplacian_filter。

(7)定义了一个新的滤波器High pass filter,做法是简单的减去低频内容。

四、实验器材(设备、元器件)

硬件配置:Windows 10 64位操作系统。

软件配置:Jupyter Notebook 6.0.0版本。

五、实验步骤

读取图片路径,并对图像进行预处理操作;将预处理后的图像进行滤波操作和融合操作;按照项目要求进行输出图像的保存操作。具体步骤是新建一个Untitled.ipynb文件,在代码行依次执行操作,见下图。

六、实验数据及结果分析

运行my_imfilter.py文件、gauss2D.py文件以及proj1.py文件(5次,一次对应data中的一对图像)后,生成图像在results文件夹中。

生成的图片是乱序的,进行了一些简单处理,如下图。

运行basiccontrasttest.py文件,可视化图像如下。

运行proj1_test_filtering.py文件,生成7张图像。

上面的四张图(从左至右)分别为归一化处理过的图像,不经过任何处理的图像,去掉高频信息的图像,高斯模糊了的图像。

上面的三张图(从左至右)分别为使用Sobel算子的滤波器处理的图像,离散拉普拉斯滤波器生成的图像,简单的减去低频信息的图像,可以看到最后一张的图像效果是最好的。

七、实验结论

以猫狗的这对图片为例,从最后融合的图像可以看出,当图像较大时,即近看,看到的是猫。这是因为融合图像的高频来自猫。当图像逐渐变小时,即变成远看,看到的是狗,这是因为融合图像的低频信息来自狗,低频信息代表远看时的信息,高频信息代表近看时的信息。其他四对生成的四个混合图像也证实了这一理论。

八、总结及心得体会

在本次实验中,基本实现了混合图像,取得了较好的实验效果,使用的填充策略是简单地用0填充图像,对图像进行了卷积和归一化处理,逐步向下采样图像将所有图像连接在一起,来可视化混合图像

通过实验发现就算是图像大小,图像中目标大小都基本相同,有了一个好的高斯滤波方差,有时候仍然得不到一个好的结果。两个例子,一是当摩托车与自行车融合的时候,可能是由于摩托车的颜色过于鲜艳,经过高频之后的信息也比较淡化,从而导致融合效果不好;二是当猫与狗融合的时候,可能是由于猫和狗胡须的差异使得图像的轮廓不够清晰,从而导致融合效果不佳。

九、对本实验过程及方法、手段的改进建议

本次实验所使用的5对图像都是对齐的,所以可以很好的混合图像。对于没有对齐的图像对而言,一定要考虑到对齐操作,即选取两个关键点并且进行对齐,使得不同大小的图像,图像中不同大小的目标能够很好的进行融合。

在实验的过程中也出现了一些问题,比如高斯滤波的方差这个超参数难以调到最优而且很麻烦,还有的就是由于某些图像额度特征导致融合效果无法取得更好的效果,这些都是以后继续研究的重点所在。

配套代码在相关博客里。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐