这是实现Hybrid Image的上机实验,即混合图像,这种图像不是简单利用两个图片按一定的权重叠加形成的,如果你将效果图放大看,你会看到图像中的高频信号,比如上图中的爱因斯坦;如果你将效果图缩小看,你会看到图像中的低频信号,比如上图中的玛丽莲。
项目分析:
- 要实现混合图像的效果,需要获取一个图像的低频部分和另一个图像的高频部分,并将处理之后的两个图像进行叠加;
- 考虑利用高斯低通滤波器的方式获取图像的低频分量,同时利用原始图像减去高斯滤波之后的图像从而获取图像的高频分量,最后通过线性叠加输出效果图像;
- 两幅图像处理唯一的不同点在于获取高频分量的图像执行了一次减法操作,因此考虑定义函数的方式完成项目。
项目执行:
1. 定义高斯滤波核
![]() |
a. 通过传入sigma参数,根据经验公式size = 8*sigma +1获取卷积核的大小同时保证卷积核尺寸为奇数;
b. 定义卷积核存储的容器,通过循环遍历高斯公式为容器的每个位置赋值,最后返回高斯滤波核。
2. 定义卷积操作;
a. 卷积核预处理:
![]() |
b. 传入卷积核并做180°旋转;
c. 获取卷积起始位置,定义卷积结果存储容器,通过循环遍历存储卷积结果并返回。
3. 定义彩色图像卷积函数;
——实际上是对上面两个函数的调用,因为Calculate卷积函数只能处理单个通道
a. 卷积预处理:对原始图像的边界进行0值填充,避免边界带来的影响;
b. 对彩色图像进行通道拆分并分别调用Calculate卷积函数实现卷积操作;
c. 将卷积后的三个通道通过np.dstack()函数进行合并返回输出结果;
4. 混合图像的生成;
a. 选取小猫的图像作为混合图像的低频部分,使用cv2.imread()读取并归一化处理,设置sigma为5;
b. 选取小狗的图像作为混合图像的高频部分,使用cv2.imread()读取并归一化处理,设置sigma为3;
c. 分别定义卷积核并传入Conv卷积函数中,对于小狗的图像需要进行减法操作获取高频分量;
d. 定义权重值线性叠加并输出混合图像;
注:sigma根据实际情况调整!