700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > OpenCV_Python图像融合时两张图片大小不一致的解决方法

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

时间:2023-02-21 08:32:33

相关推荐

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决定。 d s i z e = S i z e ( r o u n d ( f x ∗ s r c . c o l s ) , r o u n d ( f y ∗ s r c . r o w s ) ) dsize = Size(round(fx*src.cols), round(fy*src.rows)) dsize=Size(round(fx∗src.cols),round(fy∗src.rows))dst的类型与原图像相同fx:沿水平轴的比例因子 ( d o u b l e ) d s i z e . w i d t h / s r c . c o l s (double)dsize.width/src.cols (double)dsize.width/src.colsfy:沿垂直轴的比例因子 ( d o u b l e ) d s i z e . h e i g h t / s r c . r o w s (double)dsize.height/src.rows (double)dsize.height/src.rows
参数dsize和参数(fx, fy)不能够同时为0
interpolation:插值方法,共5种 INTER_LINEAR - 双线性插值(默认)(放大图像推荐使用)INTER_NEAREST - 最近邻插值INTER_AREA - 基于像素局部的重采样插值(缩小图像推荐使用)。该方法对于图像抽取(image decimation)来说可能更好,但如果是放大图像,和最近邻插值效果类似。INTER_CUBIC - 基于4x4像素邻域的3次插值(放大图像推荐使用)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:

d s i z e = S i z e ( r o u n d ( f x ∗ s r c . c o l s ) , r o u n d ( f y ∗ s r c . r o w s ) ) dsize = Size(round(fx*src.cols), round(fy*src.rows)) dsize=Size(round(fx∗src.cols),round(fy∗src.rows))

注意:也就是说cv2.resize函数的dstdsize参数输入是(宽度,高度),与img.shape相反。

对于img.shape的输出参数以及对应坐标请点击这里查看

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])图像融合函数请点击这里查看

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

import cv2import numpy as npimport matplotlib.pyplot as pltimport os os.chdir('C:/Users/lenovo/Desktop/')bear = cv2.imread('BearBrown.jpg')sky = cv2.imread('Sky.jpg')rows, cols = sky.shape[:2] #获取sky的高度、宽度#print(sky.shape[:2]) #(800, 1200)#print(bear.shape[:2]) #(224, 224)bear_dst = cv2.resize(bear,(cols,rows),interpolation=cv2.INTER_CUBIC) #放大图像add_img = cv2.addWeighted(bear_dst,0.6,sky,0.4,0) #图像融合# 显示图片titles = ['BearBrown','Sky','add_img']imgs = [bear,sky,add_img]for i in range(len(imgs)):plt.subplot(2,3,i+1)imgs[i]=cv2.cvtColor(imgs[i],cv2.COLOR_BGR2RGB)plt.imshow(imgs[i],'gray')plt.title(titles[i])plt.axis('off')plt.show()

效果展示:(布朗熊的高度宽度其实比天空的小)

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

import cv2import numpy as npimport matplotlib.pyplot as pltimport os os.chdir('C:/Users/lenovo/Desktop/')bear = cv2.imread('BearBrown.jpg')sky = cv2.imread('Sky.jpg')# 根据小图像的大小,在大图像上创建感兴趣区域roi(放置位置任意取)rows, cols = bear.shape[:2] #获取bear的高度、宽度roi = sky[0:rows, 0:cols]dst = cv2.addWeighted(bear,0.8,roi,0.2,0) #图像融合add_img = sky.copy() #对原图像进行拷贝add_img[0:rows, 0:cols] = dst # 将融合后的区域放进原图# 显示图片titles = ['BearBrown','Sky','add_img']imgs = [bear,sky,add_img]for i in range(len(imgs)):plt.subplot(2,3,i+1)imgs[i]=cv2.cvtColor(imgs[i],cv2.COLOR_BGR2RGB)plt.imshow(imgs[i],'gray')plt.title(titles[i])plt.axis('off')plt.show()

效果展示:(布朗熊的高度宽度其实比天空的小)

方法2——没有小图像的大小,同时还可以自由设置小图像在大图像的什么位置融合。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。