1 import cv2 2 import numpy as np 3 import pandas as pd 4 from PIL import Image 5 6 img1 = cv2.imread('lena.bmp', cv2.IMREAD_GRAYSCALE) 7 cv2.namedWindow("lena", cv2.WINDOW_AUTOSIZE) 8 cv2.imshow("lena", img1) 9 print(img1.shape) 10 11 img2 = cv2.imread('Cameraman.bmp', cv2.IMREAD_GRAYSCALE) 12 cv2.namedWindow("Cameraman", cv2.WINDOW_AUTOSIZE) 13 cv2.imshow("Cameraman", img2) 14 print(img2.shape) 15 16 img3 = cv2.imread('house.tif', cv2.IMREAD_GRAYSCALE) 17 cv2.namedWindow("house", cv2.WINDOW_AUTOSIZE) 18 cv2.imshow("house", img3) 19 print(img3.shape) 20 21 def concat_pic(img): 22 # numpy連接 直接用numpy的ndarray數組合並方法concatenate() 23 img_01 = np.vstack(img) # 縱向連接 24 img_02 = np.concatenate(img, axis=1) # 1 橫向連接 0 縱向連接 25 26 # pandas連接 先將圖片由ndarray轉換成dataframe格式,使用pandas的數據集連接方法concat()處理后,再由dataframe格式轉回ndarray格式 27 # ndarray to dataframe 28 df = [] 29 for i in range(len(img)): 30 df.append(pd.DataFrame(img[i])) 31 dff = pd.concat(df, axis=1) # 1 橫向連接 0 縱向連接 32 # dataframe to ndarray 33 img_03 = np.array(dff) 34 print(img_03.shape) 35 36 # 用opencv打開的圖片是numpy.ndarray格式 37 cv2.namedWindow("hecheng", cv2.WINDOW_AUTOSIZE) 38 cv2.imshow("hecheng", img_03) 39 40 keyx = cv2.waitKey(0) 41 print(keyx) 42 if keyx == 27: 43 print("你按下了Esc鍵") 44 cv2.destroyAllWindows() 45 elif keyx == ord('s'): 46 print("你保存了這張圖像") 47 cv2.imwrite("origin.png", img_03) 48 49 if __name__ == '__main__': 50 img = [img1, img2, img3] 51 concat_pic(img)
這只是用numpy 或 pandas 拼接了行或列,意思是只能橫着接或者豎着接,如果想要m*n張圖片該怎么拼接呢?
暫時的想法只是 比如說3*2一共六張圖片,先三張 三張地橫着拼成了兩大張(2張3*1),然后兩大張圖片再豎着接成一張完整的圖(3*2)
趕時間先不實現了,有沒有更好的辦法以后做圖像更深入了可能會想到。