OpenCV 合併影象
本教程將討論在 Python 中使用 Python 的 NumPy 的 concatenate()
函式組合兩個影象。
在 Python 中使用 NumPy 的 concatenate()
函式組合影象
我們可以使用 OpenCV 的 imread()
函式讀取影象並將它們儲存在矩陣中。我們可以使用 NumPy 的 concatenate()
函式來連線沿不同軸的影象矩陣。
例如,讓我們使用 NumPy 的 zeros()
函式建立兩個不同顏色的影象,然後使用 concatenate()
函式將它們水平組合。請參閱下面的程式碼。
import cv2
import numpy as np
img_1 = np.zeros((312,312,3), dtype=np.uint8)
img_1[:,:] = (255,0,0)
img_2 = np.zeros((312,312,3), dtype=np.uint8)
img_2[:,:] = (0,255,0)
img_3 = np.concatenate((img_1,img_2), axis=1)
cv2.imshow('Img_1',img_1)
cv2.imshow('Img_2',img_2)
cv2.imshow('Img_3',img_3)
cv2.waitKey(0)
輸出:
請注意,concatenate()
函式僅在兩個影象具有相同大小時才有效。concatenate()
函式的第一個引數包含我們想要組合的影象。
我們只使用了兩個影象,但我們可以使用儘可能多的影象,concatenate()
函式會將它們組合起來。axis
引數指定影象組合的方向。
我們水平組合了上面的影象,但我們也可以使用 axis=0
引數垂直組合它們。上面的程式碼只會合併大小相同的圖片,如果我們嘗試合併不同大小的圖片會報錯。
在 Python 中組合不同大小的影象
我們還可以組合兩個不同大小的影象。
例如,要水平組合兩個不同大小的影象,我們必須建立一個空白影象,其高度將等於兩個給定影象的最大高度,寬度等於給定影象的組合寬度。
我們可以使用 shape
屬性來獲取給定影象的高度和寬度,我們將使用它們來建立空白影象。建立空白影象後,我們可以給它一個我們自己選擇的顏色。
之後,我們必須用給定影象的畫素替換空白影象畫素。例如,我們先新增第一張圖片,然後再新增第二張圖片。
如果其中一個影象與另一個影象相比較小,則空白影象的其餘部分將具有我們定義的相同顏色。例如,讓我們將水果影象與貓影象結合起來。
請參閱下面的程式碼。
import cv2
import numpy as np
img_1 = cv2.imread('fruit.jpg')
img_2 = cv2.imread('cat.jpg')
h1, w1 = img_1.shape[:2]
h2, w2 = img_2.shape[:2]
img_3 = np.zeros((max(h1, h2), w1+w2,3), dtype=np.uint8)
img_3[:,:] = (255,255,255)
img_3[:h1, :w1,:3] = img_1
img_3[:h2, w1:w1+w2,:3] = img_2
cv2.imshow('Img_1',img_1)
cv2.imshow('Img_2',img_2)
cv2.imshow('Img_3',img_3)
cv2.waitKey(0)
輸出:
上面的程式碼會橫向新增兩張不同大小的圖片,但我們也可以更改程式碼為縱向新增兩張圖片。我們必須先改變空白影象的形狀。
在 Python 中垂直組合影象
在上面的程式碼中,我們將高度指定為兩個影象的最大高度,寬度等於兩個影象的組合寬度。
如果我們想垂直組合影象,我們必須建立一個空白影象,其高度等於兩個影象的組合高度,寬度等於兩個影象的最大寬度。之後,我們還必須更改第二張影象在空白影象上的位置。
在上面的程式碼中,我們新增了從第一張影象的寬度開始水平位置的第二張影象,但是在這種情況下,我們將從第一張影象的高度開始新增影象。例如,讓我們將上面的兩個影象垂直組合。
請參閱下面的程式碼。
import cv2
import numpy as np
img_1 = cv2.imread('fruit.jpg')
img_2 = cv2.imread('cat.jpg')
h1, w1 = img_1.shape[:2]
h2, w2 = img_2.shape[:2]
img_3 = np.zeros((h1+h2, max(w1,w2),3), dtype=np.uint8)
img_3[:,:] = (255,255,255)
img_3[:h1, :w1,:3] = img_1
img_3[h1:h1+h2, :w2,:3] = img_2
cv2.imshow('Img_1',img_1)
cv2.imshow('Img_2',img_2)
cv2.imshow('Img_3',img_3)
cv2.waitKey(0)
輸出:
我們可以在上面的輸出中看到兩個影象是垂直組合的。