当前位置: 首页 > article >正文

OpenCV(12):图像拼接、简单滤镜效果

1 OpenCV 图像拼接

1.1 介绍

        图像拼接是计算机视觉中的一个重要应用,它可以将多张有重叠区域的图像拼接成一张更大的图像。常见的应用场景包括全景图生成、卫星图像拼接等。OpenCV 是一个强大的计算机视觉库,提供了丰富的工具来实现图像拼接。本文将详细介绍如何使用 OpenCV 进行图像拼接,重点讲解特征点检测和匹配的技术。

        应用场景

  • 全景图生成: 将多幅图像拼接成一幅全景图。
  • 地图拼接: 将多幅地图图像拼接成一幅更大的地图。
  • 医学图像处理: 将多幅医学图像拼接成一幅完整的图像。

        图像拼接的基本流程可以分为以下几个步骤:

  1. 图像读取:读取需要拼接的图像。
  2. 特征点检测:在每张图像中检测出关键点(特征点)。
  3. 特征点匹配:在不同图像之间匹配这些特征点。
  4. 计算变换矩阵:根据匹配的特征点计算图像之间的变换矩阵。
  5. 图像融合:将图像按照变换矩阵进行拼接,并进行融合处理以消除拼接痕迹。

1.2 实现步骤

1.2.1 图像读取

        首先,我们需要读取需要拼接的图像。OpenCV 提供了 cv2.imread() 函数来读取图像。

import cv2

# 读取图像
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')

# 检查图像是否成功读取
if image1 is None or image2 is None:
    print("Error: 无法读取图像")
    exit()

1.2.2 特征点检测

        特征点检测是图像拼接的关键步骤。OpenCV 提供了多种特征点检测算法,如 SIFT、SURF、ORB 等。这里我们以 SIFT 为例进行讲解。detectAndCompute() 函数会返回两个值:关键点(keypoints)和描述符(descriptors)。关键点是图像中的显著点,描述符是对这些关键点的描述,用于后续的匹配。

# 创建 SIFT 检测器
sift = cv2.SIFT_create()

# 检测特征点和描述符
keypoints1, descriptors1 = sift.detectAndCompute(image1, None)
keypoints2, descriptors2 = sift.detectAndCompute(image2, None)

1.2.3 特征点匹配

        在检测到特征点后,我们需要在不同图像之间匹配这些特征点。OpenCV 提供了 BFMatcher 或 FlannBasedMatcher 来进行特征点匹配。knnMatch() 函数会返回每个特征点的两个最佳匹配。我们通过比率测试(Lowe's ratio test)来筛选出好的匹配点。

# 创建 BFMatcher 对象
bf = cv2.BFMatcher()

# 使用 KNN 匹配
matches = bf.knnMatch(descriptors1, descriptors2, k=2)

# 应用比率测试,筛选出好的匹配
good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append(m)

1.2.4 计算变换矩阵

        在得到好的匹配点后,我们可以使用这些点来计算图像之间的变换矩阵。常用的变换矩阵有单应性矩阵(Homography),它可以将一张图像中的点映射到另一张图像中。findHomography() 函数会返回一个 3x3 的单应性矩阵 H,它可以将 image1 中的点映射到 image2 中。

# 提取匹配点的坐标
src_pts = np.float32([keypoints1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([keypoints2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)

# 计算单应性矩阵
H, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)

1.2.5 图像融合

        最后,我们使用计算出的单应性矩阵将图像进行拼接,并进行融合处理以消除拼接痕迹。warpPerspective() 函数会根据单应性矩阵 H 对 image1 进行透视变换,并将其与 image2 进行拼接。

# 获取图像尺寸
h1, w1 = image1.shape[:2]
h2, w2 = image2.shape[:2]

# 计算拼接后图像的尺寸
pts = np.float32([[0, 0], [0, h1], [w1, h1], [w1, 0]]).reshape(-1, 1, 2)
dst = cv2.perspectiveTransform(pts, H)
[x_min, y_min] = np.int32(dst.min(axis=0).ravel() - 0.5)
[x_max, y_max] = np.int32(dst.max(axis=0).ravel() + 0.5)

# 计算平移矩阵
translation_matrix = np.array([[1, 0, -x_min], [0, 1, -y_min], [0, 0, 1]])

# 应用平移矩阵进行图像拼接
result = cv2.warpPerspective(image1, translation_matrix.dot(H), (x_max - x_min, y_max - y_min))
result[-y_min:h2 - y_min, -x_min:w2 - x_min] = image2

# 显示拼接结果
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

2 OpenCV 简单滤镜效果

        OpenCV提供了丰富的图像处理和计算机视觉算法,广泛应用于图像处理、视频分析、物体检测等领域。本文将介绍如何使用 OpenCV 实现几种简单的滤镜效果,包括灰度、怀旧和浮雕效果。以下是主要滤镜效果:

滤镜效果实现方法
灰度滤镜cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
怀旧滤镜通过调整色彩通道的权重,模拟老照片效果。
浮雕滤镜使用卷积核 [[-2, -1, 0], [-1, 1, 1], [0, 1, 2]] 进行卷积操作。
模糊滤镜cv2.GaussianBlur(image, (15, 15), 0)
锐化滤镜使用卷积核 [[0, -1, 0], [-1, 5, -1], [0, -1, 0]] 进行卷积操作。
边缘检测滤镜cv2.Canny(gray_image, 100, 200)

2.1 灰度滤镜

        灰度滤镜是最简单的滤镜之一,它将彩色图像转换为灰度图像。灰度图像只有一个通道,每个像素的值表示亮度。

import cv2

# 读取图像
image = cv2.imread('image.jpg')

# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 保存灰度图像
cv2.imwrite('gray_output.jpg', gray_image)

# 显示灰度图像
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.2 怀旧滤镜

        怀旧滤镜通过调整图像的色彩通道,使图像呈现出一种复古的效果。通常,怀旧滤镜会增加红色和绿色通道的强度,同时减少蓝色通道的强度。

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg')

# 分离 BGR 通道
b, g, r = cv2.split(image)

# 调整通道强度
r = np.clip(r * 0.393 + g * 0.769 + b * 0.189, 0, 255).astype(np.uint8)
g = np.clip(r * 0.349 + g * 0.686 + b * 0.168, 0, 255).astype(np.uint8)
b = np.clip(r * 0.272 + g * 0.534 + b * 0.131, 0, 255).astype(np.uint8)

# 合并通道
vintage_image = cv2.merge((b, g, r))

# 保存怀旧图像
cv2.imwrite('vintage_output.jpg', vintage_image)

# 显示怀旧图像
cv2.imshow('Vintage Image', vintage_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.3 浮雕滤镜

        浮雕滤镜通过计算图像中相邻像素的差值,生成一种类似于浮雕的效果,这种滤镜通常用于增强图像的边缘和纹理。

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg')

# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 定义卷积核
kernel = np.array([[-2, -1, 0],
                   [-1,  1, 1],
                   [ 0,  1, 2]])

# 应用卷积核
emboss_image = cv2.filter2D(gray_image, -1, kernel)

# 保存浮雕图像
cv2.imwrite('emboss_output.jpg', emboss_image)

# 显示浮雕图像
cv2.imshow('Emboss Image', emboss_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.4 模糊滤镜

        模糊滤镜通过平滑图像,减少图像中的噪声和细节。

import cv2

# 读取图像
image = cv2.imread("image.jpg")

# 模糊滤镜
blurred_image = cv2.GaussianBlur(image, (15, 15), 0)

# 显示结果
cv2.imshow("Blur Filter", blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.5 锐化滤镜

        锐化滤镜通过增强图像的边缘,使图像更加清晰。

import cv2
import numpy as np

# 读取图像
image = cv2.imread("image.jpg")

# 锐化滤镜
sharpen_kernel = np.array([[0, -1, 0],
                           [-1, 5, -1],
                           [0, -1, 0]])
sharpened_image = cv2.filter2D(image, -1, sharpen_kernel)

# 显示结果
cv2.imshow("Sharpen Filter", sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.6 边缘检测滤镜

        边缘检测滤镜通过检测图像中的边缘,突出显示物体的轮廓。

import cv2

# 读取图像
image = cv2.imread("image.jpg")

# 转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 边缘检测滤镜
edges_image = cv2.Canny(gray_image, 100, 200)

# 显示结果
cv2.imshow("Edges Filter", edges_image)
cv2.waitKey(0)
cv2.destroyAllWindows()


http://www.kler.cn/a/570253.html

相关文章:

  • 磁盘空间不足|如何安全清理以释放磁盘空间(开源+节流)
  • Pytorch实现之SRGAN+CBAM的结构设计
  • 【Transformer优化】什么是稀疏注意力?
  • 测试工程师Ai应用实战指南简例prompt
  • 软考教材重点内容 信息安全工程师 第18章 网络安全测评技术与标准
  • C语言嵌入式Linux高级编程:程序的编译、链接与运行深度解析
  • vue 和 react 底层采用的 diff 算法的区别
  • [数据结构]用栈实现队列
  • JUC模块
  • 点云 PCA生成包围盒流程
  • 我代表中国受邀在亚马逊云科技全球云计算大会re:Invent中技术演讲
  • 软件工程---净室软件工程
  • 分布式锁—2.Redisson的可重入锁二
  • 【基于RabbitMQ的消息队列服务器模拟实现】
  • pg pg_prewarm用法
  • 《基于Hadoop的青岛市旅游景点游客行为分析系统设计与实现》开题报告
  • nlp第十节——LLM相关
  • Spring Boot整合达梦数据库的适配改造(国产中间件)
  • MAC 本地搭建部署 dify(含 github访问超时+Docker镜像源拉取超时解决方案)
  • OpenCV计算摄影学(10)将一组不同曝光的图像合并成一张高动态范围(HDR)图像的实现类cv::MergeDebevec