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

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

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

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

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

主要函数

  1. 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(fxsrc.cols),round(fysrc.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.cols
  • fy:沿垂直轴的比例因子 ( 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(fxsrc.cols),round(fysrc.rows))

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

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

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

import cv2
import numpy as np
import matplotlib.pyplot as plt
import 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()

效果展示:(布朗熊的高度宽度其实比天空的小)
OpenCV_Python图像融合时两张图片大小不一致的解决方法_第1张图片

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

import cv2
import numpy as np
import matplotlib.pyplot as plt
import 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()

效果展示:(布朗熊的高度宽度其实比天空的小)
OpenCV_Python图像融合时两张图片大小不一致的解决方法_第2张图片
方法2——没有小图像的大小,同时还可以自由设置小图像在大图像的什么位置融合。

你可能感兴趣的:(opencv_python)