目錄
- 1. Numpy (np.hstack,np.vstack)
- 1.1 注意事項
- 1.2 代碼示例
- 2. matplotlib
- 2.1 注意事項
- 2.2 代碼示例
- 3. 擴展示例:多張小圖合并成一張大圖
- 4. 總結
1. Numpy (np.hstack,np.vstack)
語法結構:
retval = np.hstack(tup) # 水平拼接
retval = np.vstack(tup) # 垂直拼接
tup
:一個包含多個數組的元組((img1, img2, …))。這些數組將被水平堆疊(即沿第二個軸拼接)。retval
:拼接后的圖像,nparray 多維數組
1.1 注意事項
np.hstack()
按水平方向(列順序)拼接 2個或多個圖像,圖像的高度(數組的行)必須相同。np.vstack()
按垂直方向(行順序)拼接 2個或多個圖像,圖像的寬度(數組的列)必須相同。- 綜合使用
np.hstack()
和np.vstack()
函數,可以實現圖像的矩陣拼接。np.hstack()
和np.vstack()
只是簡單地將幾張圖像直接堆疊而連成一張圖像,并未對圖像進行特征提取和邊緣處理,因而并不能實現圖像的全景拼接。
1.2 代碼示例
import cv2
import numpy as npimg = cv2.imread("./img/lena.jpg")
img = cv2.resize(img, None, fx=0.5, fy=0.5) #為了完整顯示,縮小一倍
blur2 = cv2.blur(img, (2,2))#模糊處理
blur3 = cv2.blur(img, (5,5))
blur4 = cv2.blur(img, (10,10))htich = np.hstack((img,blur2))
htich2 = np.hstack((blur3,blur4))
vtich = np.vstack((htich, htich2))cv2.imshow("mergedDemo", vtich)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. matplotlib
2.1 注意事項
- opencv使用的是
BGR
模式,而matplotlib使用的是RGB
模式,所以需要將opencv中的BGR、GRAY格式轉換為RGB,使matplotlib中能正常顯示opencv的圖像。
2.2 代碼示例
import matplotlib.pyplot as plt
import cv2imgFile = "./img/lena.jpg"
img1 = cv2.imread(imgFile, cv2.IMREAD_COLOR)
img2 = cv2.imread(imgFile, cv2.IMREAD_GRAYSCALE)
img3 = cv2.imread(imgFile, cv2.IMREAD_UNCHANGED)
img4 = cv2.imread(imgFile)
# 將opencv中的BGR、GRAY格式轉換為RGB,使matplotlib中能正常顯示opencv的圖像
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2RGB)
img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2RGB)
img4 = cv2.cvtColor(img4, cv2.COLOR_BGR2RGB)
plt.rcParams['font.sans-serif'] = ['FangSong'] # 支持中文標簽
plt.subplot(221), plt.title("img1"), plt.axis('off')
plt.imshow(img1)
plt.rcParams['font.sans-serif'] = ['FangSong'] # 支持中文標簽
plt.subplot(222), plt.title("img2"), plt.axis('off')
plt.imshow(img2)
plt.rcParams['font.sans-serif'] = ['FangSong'] # 支持中文標簽
plt.subplot(223), plt.title("img3"), plt.axis('off')
plt.imshow(img3)
plt.rcParams['font.sans-serif'] = ['FangSong'] # 支持中文標簽
plt.subplot(224), plt.title("img4"), plt.axis('off')
plt.imshow(img4)
plt.show()
3. 擴展示例:多張小圖合并成一張大圖
import cv2
import numpy as np # 圖像文件路徑列表
image_paths = ['1.jpg', '2.jpg', '3.jpg', '4.jpg'] # 假設這是你的分塊圖像列表 # 獲取第一個圖像的大小以確定整個大圖的大小
first_image = cv2.imread(image_paths[0])
height, width = first_image.shape[:2] # 創建一個全黑的圖像作為背景,大小與整個大圖相同
final_image = np.zeros((height, width, 3), dtype=np.uint8) # 循環遍歷每個分塊圖像
for image_path in image_paths: chunk = cv2.imread(image_path) # 提取分塊圖像的坐標 chunk_height, chunk_width = chunk.shape[:2] start_i, start_j = image_path.split('_')[-2:] start_i, start_j = int(start_i), int(start_j) # 將分塊圖像寫入到最終圖像中 final_image[start_i:start_i+chunk_height, start_j:start_j+chunk_width] = chunk # 釋放分塊圖像占用的內存 del chunk # 保存最終合并的圖像
cv2.imwrite('final_image.jpg', final_image)
4. 總結
np.hstack
和np.vstack
用于拼接數組,而matplotlib
用于顯示圖像。NumPy
的拼接操作通常比matplotlib
更快,因為matplotlib
的主要目的不是圖像處理。- 可以先用
NumPy
進行圖像拼接,然后用matplotlib
來顯示結果。