OpenCV_Python影象融合時兩張圖片大小不一致的解決方法
阿新 • • 發佈:2019-01-08
當進行影象融合時,被疊加的兩張圖片的大小、型別(高度/寬度/通道數)必須相同。請點選檢視
但是如果這兩張圖片大小不相同,怎麼解決?有兩種方法可以解決這個問題:
- 重置其中一張圖片的大小型別,使其與另一張圖片大小型別相同;
- 在較大的圖片中建立感興趣區域roi,roi的大小型別應與另一張圖片的相同。
注意:方法1改變圖片大小時,圖片的解析度也會發生變化,因此圖片的內容會產生形變;方法2沒有改變圖片的大小,故不會有這種問題產生。
主要函式
dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
- scr:原影象
- dsize:輸出的影象大小
- dst:輸出的影象。當引數dsize不為0時,dst的大小為size;否則,它的大小需要根據src的大小,fx和fy決定。dst的型別與原影象相同
- fx:沿水平軸的比例因子
- fy:沿垂直軸的比例因子
引數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:
注意:也就是說cv2.resize
函式的dst
和dsize
引數輸入是 (寬度,高度)
,與img.shape
相反。
對於img.shape
的輸出引數以及對應座標請點選這裡檢視
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——沒有小影象的大小,同時還可以自由設定小影象在大影象的什麼位置融合。