OpenCV_Python 图像融合时两张图片大小不一致的解决方法

当进行图像融合时,被叠加的两张图片的大小、类型(高度 / 宽度 / 通道数)必须相同。请点击查看

但是如果这两张图片大小不相同,怎么解决?有两种方法可以解决这个问题:

  1. 重置其中一张图片的大小类型,使其与另一张图片大小类型相同;
  2. 在较大的图片中创建激活区域 roi,roi 的大小类型应与另一张图片的相同。

注意:方法 1 改变图片大小时,图片的分辨率也会发生变化,因此图片的内容会产生形变;方法 2 没有改变图片的大小,故不会有这种问题产生。

主要函数

dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

scr:原图像
dsize:输出的图像大小
dst:输出的图像。当参数 dsize 不为 0 时,dst 的大小为 size;否则,它的大小需要根据 src 的大小,fx 和 fy 决定。dsize=Size(round(fx∗src.cols),round(fy∗src.rows))
dst 的类型与原图像相同
fx: 沿水平轴的比例因子 (double)dsize.width/src.cols
fy: 沿垂直轴的比例因子 (double)dsize.height/src.rows

参数 dsize 和参数 (fx, fy) 不能够同时为 0

interpolation:插值方法,共 5 种:
1. INTER_LINEAR - 双线性插值(默认)(放大图像推荐使用)
2. INTER_NEAREST - 最近邻插值
3. INTER_AREA - 基于像素局部的重采样插值(缩小图像推荐使用)。该方法对于图像抽取(image decimation)来说可能更好,但如果是放大图像,和最近邻插值效果类似。
4.INTER_CUBIC - 基于 4x4 像素邻域的 3 次插值(放大图像推荐使用)
5.INTER_LANCZOS4 - 基于 8x8 像素邻域的 Lanczos(兰索斯)插值

引用官方文档 Geometric Image Transformations
dst – Destination image. It has the size dsize (when it is non-zero) or the size computed from src.size() , fx , and fy . The type of dst is the same as of src .
dsize – Destination image size. If it is zero, it is computed as:
dsize=Size(round(fx∗src.cols),round(fy∗src.rows))

注意:也就是说cv2.resize函数的dstdsize参数输入是 (宽度,高度),与img.shape相反。
对于img.shape的输出参数以及对应坐标请点击这里查看

方法 1:重置其中一张图片的大小类型,使其与另一张图片大小类型相同

pic1:
OpenCV_Python 图像融合时两张图片大小不一致的解决方法

pic2:
OpenCV_Python 图像融合时两张图片大小不一致的解决方法

import cv2

pic1 = cv2.imread(r'C:\Users\HP\Desktop\aa.jpg')
pic2 = cv2.imread(r'C:\Users\HP\Desktop\bb.jpg')


rows, cols = pic1.shape[:2]         # 获取pic1的高度、宽度
# print(pic1.shape[:2])  # (700, 700)
# print(pic2.shape[:2])  # (273, 212)

dst_img = cv2.resize(pic2, (cols, rows))   # 放大图像

运行结果:
OpenCV_Python 图像融合时两张图片大小不一致的解决方法

方法 2 在较大的图片中创建激活区域 roi,roi 的大小类型应与另一张图片的相同

import cv2

pic1 = cv2.imread(r'C:\Users\HP\Desktop\aa.jpg')
pic2 = cv2.imread(r'C:\Users\HP\Desktop\bb.jpg')

# 根据小图像的大小,在大图像上创建激活区域roi(放置位置任意取)
rows, cols = pic2.shape[:2]         # 获取pic1的高度、宽度
roi = pic1[0:rows, 0:cols]

dst = cv2.addWeighted(pic2, 0.8, roi, 0.2, 0)  # 图像融合
add_img = pic1.copy()  # 对原图像进行拷贝
add_img[0:rows, 0:cols] = dst  # 将融合后的区域放进原图

# 显示图片
cv2.imshow('res', add_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

激活区域如图:
OpenCV_Python 图像融合时两张图片大小不一致的解决方法

融合图片如图:
OpenCV_Python 图像融合时两张图片大小不一致的解决方法