OpenCV_Python 图像融合时两张图片大小不一致的解决方法
当进行图像融合时,被叠加的两张图片的大小、类型(高度 / 宽度 / 通道数)必须相同。请点击查看
但是如果这两张图片大小不相同,怎么解决?有两种方法可以解决这个问题:
- 重置其中一张图片的大小类型,使其与另一张图片大小类型相同;
- 在较大的图片中创建激活区域 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
函数的dst
和dsize
参数输入是 (宽度,高度)
,与img.shape
相反。
对于img.shape
的输出参数以及对应坐标请点击这里查看
方法 1:重置其中一张图片的大小类型,使其与另一张图片大小类型相同
pic1:
pic2:
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)) # 放大图像
运行结果:
方法 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()
激活区域如图:
融合图片如图:
图片满分
☺
这个文章选的真好看!