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 来显示结果。
相关推荐
扉间7981 小时前
Transformer 核心概念转化为夏日生活类比
人工智能·transformer
要努力啊啊啊4 小时前
YOLOv1 技术详解:正负样本划分与置信度设计
人工智能·深度学习·yolo·计算机视觉·目标跟踪
vlln5 小时前
【论文解读】OmegaPRM:MCTS驱动的自动化过程监督,赋能LLM数学推理新高度
人工智能·深度学习·神经网络·搜索引擎·transformer
2501_915374355 小时前
LangChain自动化工作流实战教程:从任务编排到智能决策
python·langchain·自动化
sky丶Mamba6 小时前
如何编写高效的Prompt:从入门到精通
人工智能·prompt
chilavert3187 小时前
深入剖析AI大模型:Prompt 开发工具与Python API 调用与技术融合
人工智能·python·prompt
科技林总8 小时前
支持向量机:在混沌中划出最强边界
人工智能
陈佬昔没带相机8 小时前
基于 open-webui 搭建企业级知识库
人工智能·ollama·deepseek
Mallow Flowers8 小时前
Python训练营-Day31-文件的拆分和使用
开发语言·人工智能·python·算法·机器学习
蓝婷儿9 小时前
Python 爬虫入门 Day 2 - HTML解析入门(使用 BeautifulSoup)
爬虫·python·html