1. 程式人生 > >OpenCV_Python影象融合時兩張圖片大小不一致的解決方法

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決定。dsize=Size(round(fxsrc.cols),round(fysrc.rows))dsize = Size(round(fx*src.cols), round(fy*src.rows))dst的型別與原影象相同
  • fx:沿水平軸的比例因子 (double)dsize.width/src.cols(double)dsize.width/src.cols
  • fy:沿垂直軸的比例因子 (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(蘭索斯)插值

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(fxsrc.cols),round(fysrc.rows))dsize = Size(round(fx*src.cols), round(fy*src.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()

效果展示:(布朗熊的高度寬度其實比天空的小)
在這裡插入圖片描述

方法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()

效果展示:(布朗熊的高度寬度其實比天空的小)
在這裡插入圖片描述
方法2——沒有小影象的大小,同時還可以自由設定小影象在大影象的什麼位置融合。