当前位置: 代码网 > it编程>前端脚本>Python > OpenCV 4基础篇| OpenCV图像的拼接

OpenCV 4基础篇| OpenCV图像的拼接

2024年07月31日 Python 我要评论
np.hstack和np.vstack用于拼接数组,而matplotlib用于显示图像。NumPy的拼接操作通常比matplotlib更快,因为matplotlib的主要目的不是图像处理。可以先用NumPy进行图像拼接,然后用matplotlib来显示结果。

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()

1

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()

11

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.hstacknp.vstack 用于拼接数组,而 matplotlib 用于显示图像。
  • numpy 的拼接操作通常比 matplotlib 更快,因为 matplotlib 的主要目的不是图像处理。
  • 可以先用 numpy 进行图像拼接,然后用 matplotlib 来显示结果。
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com