目录
1. numpy (np.hstack,np.vstack)
语法结构:
retval = np.hstack(tup) # 水平拼接
retval = np.vstack(tup) # 垂直拼接
tup
:一个包含多个数组的元组((img1, img2, …))。这些数组将被水平堆叠(即沿第二个轴拼接)。retval
:拼接后的图像,nparray 多维数组
1.1 注意事项
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 注意事项
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
来显示结果。
发表评论