目录
- 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 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
来显示结果。