目录

1. Numpy (np.hstack,np.vstack)1.1 注意事项1.2 代码示例

2. matplotlib2.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 来显示结果。

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: