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

目录

  • [1. Numpy (np.hstack,np.vstack)](#1. Numpy (np.hstack,np.vstack))
    • [1.1 注意事项](#1.1 注意事项)
    • [1.2 代码示例](#1.2 代码示例)
  • [2. matplotlib](#2. matplotlib)
    • [2.1 注意事项](#2.1 注意事项)
    • [2.2 代码示例](#2.2 代码示例)
  • [3. 扩展示例:多张小图合并成一张大图](#3. 扩展示例:多张小图合并成一张大图)
  • [4. 总结](#4. 总结)

1. Numpy (np.hstack,np.vstack)

语法结构:

csharp 复制代码
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 代码示例

csharp 复制代码
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 代码示例

csharp 复制代码
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. 扩展示例:多张小图合并成一张大图

csharp 复制代码
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 来显示结果。
相关推荐
jia V iuww5204 分钟前
数据分析
人工智能·数据挖掘·数据分析
VB.Net11 分钟前
EmguCV学习笔记 VB.Net 12.1 二维码解析
opencv·计算机视觉·c#·图像·vb.net·二维码·emgucv
Flying_Fish_roe17 分钟前
Spring Boot-RESTful API相关问题
spring boot·python·restful
AI第一基地1 小时前
推荐系统-电商直播 多目标排序算法探秘
人工智能·深度学习·排序算法·transformer·知识图谱·word2vec
叫我:松哥1 小时前
基于机器学习的癌症数据分析与预测系统实现,有三种算法,bootstrap前端+flask
前端·python·随机森林·机器学习·数据分析·flask·bootstrap
我是瓦力1 小时前
球形包围框-Bounding Sphere-原理-代码实现
人工智能·python·深度学习·计算机视觉·3d
开MINI的工科男1 小时前
【笔记】自动驾驶预测与决策规划_Part1_自动驾驶决策规划简介
人工智能·笔记·自动驾驶
网络研究院1 小时前
企业急于采用人工智能,忽视了安全强化
网络·人工智能·安全·工具·风险·企业
jndingxin1 小时前
OpenCV特征检测(3)计算图像中每个像素处的特征值和特征向量函数cornerEigenValsAndVecs()的使用
人工智能·opencv·计算机视觉
CharGer.1 小时前
OpenCVHaar级联器实现人脸捕捉和微笑检测
opencv·视觉检测·人脸检测·haar·微笑检测