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 np img = 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 cv2 imgFile = "./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
来显示结果。