照片拼接—使用NumPy數組操作就能輕鬆實現

導讀:生活中常常需要將兩張或多張不同的照片拼接在一起,使用NumPy數組操作可以輕鬆實現相同大小、不同大小的兩張或多張照片的拼接。

一、concatenate()方法實現NumPy數組合並

在Python中,照片可以視為數組。因此可以通過數組合並實現照片拼接。NumPy的concatenate()方法用於將多維數組進行合併,它的格式為:

<code>numpy.concatenate((a1,a2,...), axis=0)/<code>

其中a1,a2,...是數組類型。在合併數組時,需要使用axis參數指定數組合並的方向(維度)。concatenate()方法能夠一次完成多個數組的合併。

二、concatenate()方法拼接照片的注意事項

照片有多種格式,它們的形狀不相同。jpg格式照片的形狀為(height, width, channel). 是3維數組。如果要將兩張或多張照片沿縱向拼接,需設置axis=0. 如果要將兩張或多張照片沿橫向拼接,需設置axis=1. 將照片沿某個維度拼接時,需保證它們在除該維度以外的其它所有維度上的形狀相同。灰度圖由於只有一個通道,是二維數組,它只能與灰度圖進行拼接。png格式的照片通道數為4,它只能與png格式的照片拼接,

三、相同形狀的照片拼接

拼接照片前,應先觀察每張照片的形狀。如果照片的形狀相同,則可以直接將它們沿縱向或橫向拼接在一起。下面代碼將兩張形狀相同的照片橫向拼接在一起。

<code>import numpy as np
import matplotlib.pyplot as plt
img1=plt.imread('.../renwu050.jpg')
img2=plt.imread('.../renwu051.jpg')
print('img1彩色圖像的形狀為:',img1.shape)
print('img2彩色圖像的形狀為:',img2.shape)
img_concat=np.concatenate((img1,img2),axis=1)
plt.figure(dpi=200)
plt.axis('off')
plt.imshow(img_concat)
plt.show()/<code>

輸出結果為:

<code>img1彩色圖像的形狀為: (1000, 640, 3)
img2彩色圖像的形狀為: (1000, 640, 3)/<code>

可以看出,兩張照片的形狀完全相同。輸出結果為:

照片拼接—使用NumPy數組操作就能輕鬆實現

橫向拼接兩張大小相同的照片

下面的代碼將兩張形狀相同的照片縱向拼接在一起。

<code>img_concat=np.concatenate((img1,img2),axis=0)
plt.figure(dpi=200)
plt.axis('off')
plt.imshow(img_concat)
plt.show()/<code>

輸出結果為:

照片拼接—使用NumPy數組操作就能輕鬆實現

縱向拼接兩張大小相同的照片

四、不同形狀的照片拼接

如果要將不同大小的照片拼接,需要對照片進行切片(即裁剪),使除拼接方向以外的其它維度形狀都相同。

以下代碼將兩張不同大小的照片橫向拼接。首先觀察兩張照片的大小。

<code>img1=plt.imread('.../renwu034.jpg')
img2=plt.imread('.../renwu040.jpg')
print('img1彩色圖像的形狀為:',img1.shape)
print('img2彩色圖像的形狀為:',img2.shape)/<code>

輸出結果為:

<code>img1彩色圖像的形狀為: (896, 640, 3)
img2彩色圖像的形狀為: (1138, 640, 3)/<code>

可以看出,兩張照片的高度(shape[0])不同,寬度(shape[1])相同。如果縱向拼接則沒有問題。如果要橫向拼接,則需要將第二張較高的圖片裁剪為與第一張的照片高度相同。可以使用切片實現照片的裁剪。代碼如下:

<code>img_concat=np.concatenate((img1,img2[0:896,:,:]),axis=1)
plt.figure(dpi=200)
plt.axis('off')
plt.imshow(img_concat)

plt.show()/<code>
照片拼接—使用NumPy數組操作就能輕鬆實現

採用切片將不同高度的照片裁剪為相同高度,並進行橫向拼接

如果要將更多照片拼接在一起,可以綜合使用切片、橫向合併、縱向合併方法來實現。以下代碼將三張張不同大小的照片拼接在一起。首先觀察三張照片的形狀。

<code>img1=plt.imread(path+'renwu034.jpg')
img2=plt.imread(path+'juhua004.jpg')
img3=plt.imread(path+'juhua002.jpg')
print('img1彩色圖像的形狀為:',img1.shape)

print('img2彩色圖像的形狀為:',img2.shape)
print('img3彩色圖像的形狀為:',img3.shape)/<code>

輸出結果為:

<code>img1彩色圖像的形狀為: (896, 640, 3)
img2彩色圖像的形狀為: (452, 640, 3)
img3彩色圖像的形狀為: (739, 550, 3)/<code>

可以看出,3張照片的大小都不相同,我們的目標是將第二、三張照片縱向拼接,然後將拼接結果與第一張照片橫向拼接。因此,首先對第二張、第三張照片切片,使它們的寬度相同(550), 並使它們的高度和與第一張照片的高度相同(896). 將後兩張的切片縱向拼接,然後與第一張橫向接在一起。實現代碼如下:

<code>img_concat1=np.concatenate((img2[0:400,90:640,:],img3[0:896-400,:,:]),axis=0)
print('img_concat1.shape的形狀為:',img_concat1.shape)
img_concat=np.concatenate((img1,img_concat1),axis=1)
plt.figure(dpi=200)
plt.axis('off')
plt.imshow(img_concat)
plt.show/<code>

輸出結果為:

<code>img_concat1.shape的形狀為: (896, 550, 3)/<code>
照片拼接—使用NumPy數組操作就能輕鬆實現

多張不同大小的照片拼接

用戶可以調整各個照片的切片,獲得需要的照片內容。


分享到:


相關文章: