实现在一张图片中寻找另一张图片的目标

这篇具有很好参考价值的文章主要介绍了实现在一张图片中寻找另一张图片的目标。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OpenCV库中的SIFT特征检测算法和FLANN(快速最近邻搜索库)匹配算法来找到一个图片中的元素在另一个图片中的位置,并在源图片中标出它们的位置。

以下是一个简单的例子,使用OpenCV库,利用SIFT特征检测算法,在一张图片中找到另外一张图片中的目标,这其中目标图片中的元素被识别为“模板”,被查找的图片中的元素被识别为“源”,代码示例如下:

import cv2


def fetch_match():
    template = cv2.imread("tmp.jpg")
    source = cv2.imread("source.jpg")
    template_gray = cv2.cvtColor(template, cv2.COLOR_BGRA2GRAY)
    source_gray = cv2.cvtColor(source, cv2.COLOR_BGRA2GRAY)
    try:  #  OpenCV 库到版本3.0及更高版本支持调用此方法
        sift = cv2.xfeatures2d.SIFT_create()
    except Exception as e:
        sift = cv2.SIFT_create()  # 低版本会调用此方法
    kp1, des1 = sift.detectAndCompute(template_gray, None)
    kp2, des2 = sift.detectAndCompute(source_gray, None)

    flann = cv2.FlannBasedMatcher({"algorithm": 0, "trees": 5}, {"checks": 50})
    matches = flann.knnMatch(des1, des2, k=2)

    good_matches = []
    for m, n in matches:
        if m.distance < 0.7 * n.distance:
            good_matches.append(m)
    result = cv2.drawMatches(template, kp1, source, kp2, good_matches, None)
    cv2.imshow("Result", result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

fetch_match()

效果如下:
实现在一张图片中寻找另一张图片的目标,Python-图像处理,python具体方法介绍
sift.detectAndCompute():是SIFT算法中的一个方法,用于检测关键点并计算描述符。该方法需要传入一幅图像,并返回检测到的关键点和对应的描述符

img = cv2.imread("img.png")
# 创建sift对象
try:
    sift = cv2.xfeatures2d.SIFT_create()
except Exception as e:
    sift = cv2.SIFT_create()
# 检测关键点并计算描述符
kp, des = sift.detectAndCompute(img, None)

cv2.FlannBasedMatcher():是OpenCV中的一个匹配器,基于FLANN算法进行匹配。FLANN是快速最近邻搜索库的缩写。该方法需要一个参数字典以设置FLANN算法的参数,并且需要一个检索器参数和一个搜索参数。示例代码如下:

# 创建FlannBasedMatcher 对象
    flann = cv2.FlannBasedMatcher({"algorithm": 0, "trees": 5}, {"checks": 50})

flann.knnMatch(): 是OpenCV中的一个FLANN最近邻算法匹配函数,用于在两组描述符之间进行最近邻搜索。该方法接受两组描述符作为输入,并返回描述符的匹配。示例代码如下

# 创建FlannBasedMatcher 对象
flann = cv2.FlannBasedMatcher({"algorithm": 0, "trees": 5}, {"checks": 50})
# 应用knnMatch来找到好的匹配
matches = flann.knnMatch(des1, des2, k=2)

cv2.drawMatches():是OpenCV中的一个绘图函数,用于绘制两幅图像之间的匹配。该方法需要传入两幅图像、描述符和匹配。示例代码如下:

img1 = cv2.imread("img.png")
img2 = cv2.imread("img_1.png")
# 创建SIFT对象
try:
    sift = cv2.xfeatures2d.SIFT_create()
except Exception as e:
    sift = cv2.SIFT_create()
# 找到关键点和描述符
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# 创建FlannBasedMatcher对象
flann = cv2.FlannBasedMatcher({'algorithm': 0, 'trees': 5}, {'checks': 50})
# 查找匹配数据
matches = flann.knnMatch(des1, des2, k=2)
good_matches = []
for  m, n in matches:
    if m.distance < 0.7 * n.distance:
        good_matches.append(m)
result_img = cv2.drawMatches(img1, kp1, img2, kp2, good_matches, None, flags=2)

SIFT算法的主要思想
通过连续的图像滤波和关键点检测来提取描述图像中稳定的局部特征。SIFT算法对图像进行多次高斯平滑滤波,并计算不同尺度和方向上的梯度幅值和方向,得出图像中的局部特征。然后,通过Oriented Histogram描述符来描述这些特征。

以下是关键步骤:

  1. 构建高斯金字塔
    先对图像进行高斯模糊操作,通过不断降采样得到一个二维高斯金字塔,每一层都是前一层的1/4 大小。通过这个金字塔,可以表示不同的变化尺度。

  2. 检测极值点
    在高斯金字塔中找到那些在空间和尺度上都是极大值或极小值的点。这些点通常称为关键点,因为它们在各个尺度上都是稳定的。

  3. 精确定位关键点
    对于检测到的关键点,使用一个偏导数的Hessian矩阵来获取关键点的精确位置和尺度。

  4. 确定关键点的主方向
    根据关键点周围像素的梯度方向,计算出关键点的主方向。然后将关键点描述符旋转至该方向,以提高描述符的不变性。

  5. 描述符生成
    将关键点附近的像素划分成小块,并计算每个块内像素的梯度幅值和方向。然后利用一个128维特征向量来描述关键点。这个描述符具有旋转不变性、缩放不变性和视角不变性。

img = cv2.imread("img.png")
try:
     sift = cv2.xfeatures2d.SIFT_create()
 except Exception as e:
     sift = cv2.SIFT_create()
 kp, des = sift.detectAndCompute(img, None)
 # 在图像上绘制关键点
 result = cv2.drawKeypoints(img, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# 窗口显示图像
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

实现在一张图片中寻找另一张图片的目标,Python-图像处理,python文章来源地址https://www.toymoban.com/news/detail-704513.html

到了这里,关于实现在一张图片中寻找另一张图片的目标的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • chatgpt赋能python:Python多条图形绘制在一张图里的实现方法及应用

    作为一款优秀的编程语言,Python在数据可视化方面有着非常出色的表现。然而有时候我们需要在一张图里绘制多条不同的图形,这时候Python又有什么好的解决方案呢?本文将介绍多种方法实现Python在一张图里画多条图形,并探讨其在实际应用中的作用。 Matplotlib可以说是Pyth

    2024年02月12日
    浏览(45)
  • chatgpt赋能python:Python如何在一张图上画多条折线

    Python是一种重要的编程语言,逐渐成为数据科学和数据分析领域的神器。在数据可视化方面,Python有一些很好的库,如matplotlib、Seaborn和ggplot等。其中,matplotlib是Python中最著名、最广泛使用的一个数据可视化库,因为它能够生成各种类型的图表,包括条形图、折线图、散点图

    2024年02月12日
    浏览(53)
  • python 将多个模型的ROC曲线绘制在一张图里(含图例)

    调用方法时,需要把模型本身(如clf_xx)、模型名字(如GBDT)和对应颜色(如crimson)按照顺序、以列表形式传入函数作为参数。 (1)plt.figure(figsize=(20, 20), dpi=dpin) 在for循环外绘制图片的大体框架。 figsize 控制图片大小, dpin 控制图片的信息量(其实可以理解为清晰度?docume

    2023年04月08日
    浏览(47)
  • Power BI 实现日历图,在一张图中展示天、周、月数据变化规律

    《数据可视化》这本书里介绍了一个时间可视化的案例(如下图所示), 以日历图的形式展示数据的变化 ,可以在一张图上同时观察到: (1)每一天的数据变化;(2)随周变化的数据规律;(3)随月变化的数据规律。 这样的展示形式对于所有随日期变化的数据都有参考价

    2024年02月07日
    浏览(54)
  • 【图像处理】Python判断一张图像是否亮度过低

    比如: 直方图: 代码: 这段代码是一个用于判断图像亮度是否过暗的函数is_dark,并对输入的图像进行可视化直方图展示。 首先,通过import语句导入了cv2和matplotlib.pyplot模块,用于图像处理和可视化。 is_dark函数的作用是判断输入图像的平均亮度是否低于设定的阈值。函数接

    2024年02月16日
    浏览(69)
  • mysql 查询在一张表不在另外一张表的记录

    SQL Join子句,主要用在select语句中,把两个或多个表的行结合起来,基于这些表之间的共同字段(往往是id字段)来查询,从多个表中返回满足条件的所有行。 常见join子句类型 常见join子句类型有INNER JOIN(同JOIN)、LEFT JOIN、RIGHT JOIN、FULL JOIN,其中第一种为内连接,后三种为外连接

    2023年04月26日
    浏览(42)
  • 图像处理(1):用Python实现彩色图像转为灰度图像的两种方法以及批量将图片转为灰度图

    用Python实现彩色图像转为灰度图像的两种方法介绍 这篇文章给大家主要介绍使用 Python 将彩色图像转为灰度图像的两种方法,以及用 Python 批量将图片转为灰度图的方法,供大家参考: 使用Python中的cv2库,它自带彩色转灰度的方法,并且代码非常简单。 先读取一张彩色图片,然

    2024年02月11日
    浏览(43)
  • 自动驾驶采集多视角图像处理(python实现不同文件夹下同名图片批量拼接并生成视频)

    目录 1.图像拼接 2.合成视频 2.1 cv2.videowriter_fourcc功能介绍 2.2读取图片合成视频 实现目标:将自动驾驶车6个摄像头采集到的图片,按照正确顺序拼接显示,nuScenes数据集测试如下: 图像存放文件夹目录如下: 每个目录下有相同名称,不同视角采集到的图像 。 先显示图片,代

    2024年01月18日
    浏览(63)
  • SQL - 将查询结果插入到另一张表中

    注意:字段必须一致(位置一致,类型一致),否则会出现数据转换错误。 例如,要将 test 表插入到 newTest 表中,则可以通过如下SQL语句实现: 使用场景: 从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。

    2024年02月16日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包