python数字图像处理基础(九)——特征匹配

这篇具有很好参考价值的文章主要介绍了python数字图像处理基础(九)——特征匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

蛮力匹配(ORB匹配)

Brute-Force匹配非常简单,首先在第一幅图像中选取一个关键点然后依次与第二幅图像的每个关键点进行(描述符)距离测试,最后返回距离最近的关键点.

对于BF匹配器,首先我们必须使用**cv2.BFMatcher()**创建 BFMatcher 对象。它需要两个可选的参数:

  • normType:它指定要使用的距离测量,默认情况下,它是cv2.NORM_L2,它适用于SIFT,SURF等(cv2.NORM_L1也在那里)。对于基于二进制字符串的描述符,如ORB,BRIEF,BRISK等,应使用cv2.NORM_HAMMING,使用汉明距离作为度量,如果ORB使用WTA_K == 3or4,则应使用cv2.NORM_HAMMING2
  • crossCheck:默认值为False。如果设置为True,匹配条件就会更加严格,只有到A中的第i个特征点与B中的第j个特征点距离最近,并且B中的第j个特征点到A中的第i个特征点也是最近时才会返回最佳匹配,即这两个特征点要互相匹配才行

两个重要的方法是BFMatcher.match()BFMatcher.knnMatch(), 第一个返回最佳匹配, 第二种方法返回k个最佳匹配,其中k由用户指定.

使用cv2.drawMatches()来绘制匹配的点,它会将两幅图像先水平排列,然后在最佳匹配的点之间绘制直线。如果前面使用的BFMatcher.knnMatch(),现在可以使用函数cv2.drawMatchsKnn为每个关键点和它的个最佳匹配点绘制匹配线。如果要选择性绘制就要给函数传入一个掩模.

一对一匹配 BFMatcher.match()

import numpy as np
import cv2
from matplotlib import pyplot as plt

img1 = cv2.imread('./image/girl1.jpg')
img2 = cv2.imread('./image/girl2.jpg')

sift = cv2.SIFT_create()

# kp代表特征点 des每个点对应特征向量
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

bf = cv2.BFMatcher(crossCheck=True)  # 可选对象crossCheck

# 1对1匹配
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)  # 排序,通过距离来度量

img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:30], None, flags=2)  # matches[:10] 距离前十的给显示出来,即显示十条匹配线

cv2.imshow('img', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

python数字图像处理基础(九)——特征匹配,数字图像处理,python,opencv,开发语言,计算机视觉

k对最佳匹配 BFMatcher.knnMatch()

import numpy as np
import cv2
from matplotlib import pyplot as plt

img1 = cv2.imread('./image/girl1.jpg')
img2 = cv2.imread('./image/girl2.jpg')

sift = cv2.SIFT_create()

# kp代表特征点 des每个点对应特征向量
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

# k对最佳匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

good = []
for m, n in matches:
    # 过滤方法
    if m.distance < 0.75 * n.distance:
        good.append([m])

img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2)

cv2.imshow('img', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

python数字图像处理基础(九)——特征匹配,数字图像处理,python,opencv,开发语言,计算机视觉

RANSAC算法

蛮力匹配是一种简单而直观的匹配方法,适用于小规模的特征点匹配。通过比较所有可能的特征点对,找到最佳匹配。而RANSAC算法则通过随机采样和一致性检验,从包含噪声的数据中估计出正确的模型参数,对于一些存在噪声和异常值的情况,RANSAC能够更稳健地估计模型。

利用RANSAC算法计算变换矩阵

RANSAC是"RANdom SAmple Consensus"(随机一致采样)的缩写。该方法是用来找到正确模型来拟合带有噪声数据的迭代方法。给定一个模型,例如点集之间的单应性矩阵。基本的思想是:数据中包含正确的点和噪声点,合理的模型应该能够在描述正确数据点的同时摒弃噪声点。

此外还有ORB匹配、SIFT的特征匹配、基于FLANN的匹配器的匹配,等等

全景图像拼接

全景图像拼接是将多张图像拼接成一张全景图的任务。在这个过程中,特征点匹配和单应性矩阵估计是关键的步骤。你提到的使用SIFT找到特征点,并通过单应性矩阵将图像进行变换,是一种常见的方法。这样可以在不同视角或位置拍摄的图像中找到对应的特征点,从而实现拼接。

通过SIFT找特征点

关于单应性矩阵(H矩阵):

利用两个图像中至少四个特征点能够求解一个单应性矩阵(homography matrix),然后用这个单应性矩阵能够将图像1中的某个坐标变换到图像2中对应的位置。然而,矩阵的推导是来自于相机在不同位姿拍摄同一个三维平面,所以使用opencv计算单应性矩阵的时候前提是两个图像对应区域必须是同一平面。

当进行全景图像拼接时,常常需要使用RANSAC算法估计单应性矩阵。下面是一个简单的示例代码,其中包括特征点匹配、RANSAC算法和全景图像拼接的步骤。

import cv2
import numpy as np

def find_keypoints_and_descriptors(image):
    # 使用SIFT算法找到图像的关键点和描述符
    sift = cv2.SIFT_create()
    kp, des = sift.detectAndCompute(image, None)
    return kp, des

def match_keypoints(des1, des2):
    # 使用BFMatcher进行特征点匹配
    bf = cv2.BFMatcher()
    matches = bf.knnMatch(des1, des2, k=2)
    
    # 使用比值测试排除不好的匹配
    good = []
    for m, n in matches:
        if m.distance < 0.75 * n.distance:
            good.append(m)
    
    return good

def ransac_homography(matches, kp1, kp2, reproj_thresh=4.0):
    # 将匹配的关键点转换为numpy数组
    src_pts = np.float32([kp1[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
    dst_pts = np.float32([kp2[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)
    
    # 使用RANSAC算法估计单应性矩阵
    H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, reproj_thresh)
    
    return H

def stitch_images(image1, image2, H):
    # 将图像1进行透视变换,将其叠加到图像2上
    rows1, cols1 = image1.shape[:2]
    rows2, cols2 = image2.shape[:2]
    warp_img1 = cv2.warpPerspective(image1, H, (cols1 + cols2, rows2))
    warp_img1[:rows2, :cols2] = image2
    
    return warp_img1

if __name__ == "__main__":
    # 读取两张图像
    img1 = cv2.imread('image1.jpg')
    img2 = cv2.imread('image2.jpg')
    
    # 找到关键点和描述符
    kp1, des1 = find_keypoints_and_descriptors(img1)
    kp2, des2 = find_keypoints_and_descriptors(img2)
    
    # 进行特征点匹配
    matches = match_keypoints(des1, des2)
    
    # 使用RANSAC估计单应性矩阵
    H = ransac_homography(matches, kp1, kp2)
    
    # 进行全景图像拼接
    result = stitch_images(img1, img2, H)
    
    # 显示拼接结果
    cv2.imshow('Panorama', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

为了达到更好的拼接效果,可能需要使用更复杂的图像配准和融合技术。文章来源地址https://www.toymoban.com/news/detail-805210.html


到了这里,关于python数字图像处理基础(九)——特征匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python数字图像处理基础(五)——Canny边缘检测、图像金字塔、图像分割

    梯度是什么? 梯度就是变化的最快的那个方向 edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 第一个参数是需要处理的原图像,该图像必须为单通道的灰度图; 第二个参数是阈值1; 第三个参数是阈值2。 原理步骤 1)使用高斯滤波器,以平滑图像,滤除噪

    2024年01月18日
    浏览(32)
  • python数字图像处理基础(二)——图像基本操作、滑动条、鼠标操作

    import cv2 import numpy as np import matplotlib.pyplot as plt 图像读取 cv2.MREAD_COLOR: 彩色图像 或用1 cv2.IMREAD_GRAYSCALE:灰度图像 或用0 img = cv2.imread(‘cat.jpg’, cv2.IMREAD_GRAYSCALE) 等同于: img = cv2.imread(‘cat.jpg’, 0) 图像的显示,也可以创建多个窗口 cv2.imshow(‘img’, img) 等待时间,毫秒级,0表示

    2024年01月18日
    浏览(39)
  • OpenCV数字图像处理实战二:模板匹配(C++)

    (1)首先需要一个模板图像 T(子图像)和一个待检测的图像(源图像 S) (2)在待检测图像从左到右,从上到下计算模板图像与重叠子图像的匹配度,匹配度越高,两者相同的可能性越大。 3.1 单模板匹配 注意:result的长宽正好是(原图-模板图)的长宽,result图中白亮程

    2024年02月15日
    浏览(34)
  • python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法

    原理 Harris 角点检测是一种用于在图像中检测角点的算法。角点是图像中局部区域的交叉点或者突出的特征点。Harris 角点检测算法旨在寻找图像中对于平移、旋转和尺度变化具有不变性的角点。 该算法通过计算图像中每个像素点的灰度值的变化,来识别角点。具体来说,Ha

    2024年01月19日
    浏览(35)
  • python数字图像处理基础(七)——直方图均衡化、傅里叶变换

    均衡化原理 图像均衡化是一种基本的图像处理技术,通过更新图像直方图的像素强度分布来调整图像的全局对比度。这样做可以使低对比度的区域在输出图像中获得更高的对比度。 简单理解:改变图像对比度,让色彩更丰富,灰度值直方图:瘦高 - 均衡 本质上,直方图均衡

    2024年01月18日
    浏览(42)
  • 数字信号与图像处理实验三:图像处理基础与图像变换

    ​ 通过本实验加深对数字图像的理解,熟悉MATLAB中的有关函数;应用DCT对图像进行变换;熟悉图像常见的统计指标,实现图像几何变换的基本方法。 ​ 选择两幅图像,读入图像并显示,同时使用Matlab计算图像的大小,灰度平均值、协方差矩阵、灰度标准差和相关系数。 DC

    2024年02月04日
    浏览(46)
  • OpenCV-Python中的图像处理-模板匹配

    使用模板匹配可以在一幅图像中查找目标 函数: cv2.matchTemplate(), cv2.minMaxLoc() 模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。 OpenCV 为我们提供了函数: cv2.matchTemplate()。和 2D 卷积一样,它也是用模板图像在输入图像(大图)上滑动,并在每一个位置对模板图像

    2024年02月12日
    浏览(26)
  • 数字图像处理MATLAB大作业:基础版

    本次程序共分为10个功能点: 第一个功能点是实现彩色图像的灰度化、灰度图像的二值化及图像的灰度变化。 第二个功能点是实现图像的代数运算及逻辑运算。 第三个功能点是基于直方图修正的图像增强。 第四个功能点是基于空间域去实现图像平滑和提取图像边缘。 第五个

    2024年02月05日
    浏览(31)
  • 彩色图像处理之彩色图像直方图处理的python实现——数字图像处理

    彩色图像的直方图处理是一种重要的图像处理技术,用于改善图像的视觉效果,增强图像的对比度,或为后续的图像处理任务(如图像分割、特征提取)做准备。彩色图像通常由红色(R)、绿色(G)、蓝色(B)三个颜色通道组成,因此彩色图像的直方图处理相比单色图像更

    2024年01月23日
    浏览(48)
  • 《数字图像处理-OpenCV/Python》连载:形态学图像处理

    本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 形态学图像处理是基于形状的图像处理,基本思想是利用各种形状的结构元进行形态学运算,从图像中提取表达和描绘区域形状的结构信息。形态学运算的数学原

    2024年02月19日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包