Python——OpenCV库的学习(十五):图像特征

这篇博客介绍了图像处理中的角点检测技术,特别是使用Harris角点检测方法,以及如何通过调整参数来影响检测结果。此外,还探讨了尺度空间的概念,并详细阐述了SIFT(尺度不变特征变换)算法,包括关键点的检测与绘制。博主展示了SIFT在图像匹配中的应用,包括蛮力匹配和最佳匹配策略,最后讨论了这些技术在全景图像拼接中的潜在应用。
摘要由CSDN通过智能技术生成

笔记和用法都在代码注释中:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# -----------------------角点检测-------------: Harris 角点检测  【可以快速检测出 角点 , 就是 角
# cv.cornerHarris(img,blockSize=,ksize=,k=)
# img :   数据类型 :为 float 32 的入图像
# blockSize :  角点检测中指定区域的大小
# ksize :  Sobel 求导中使用的 窗口大小
# k :  取值 参数 为 : 【0,04,0.06】

# img = cv.imread('666.jpg')
# img = cv.resize(img,(500,500))
# print('666.jpg:',img.shape)
# gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# dst = cv.cornerHarris(gray,2,3,0.04)   # 每一个点都算完了 【计算图像的角点】
# print('dst.shape:',dst.shape)
#
# # ----------参数越小, 点越多 , 自己设置感受 !!!
# img[dst>0.1*dst.max()] = [0,0,255]  #  如果变化程度大于了 0。01 , 那么就可能是一个角点, 就会画出来 【画笔为红色(0,0,255)】
# cv.imshow('dst',img)
# cv.waitKey(0)
# cv.destroyAllWindows()


# -----------------------图像尺度空间-------------:让计算机在 清晰和模糊;远和近 的情况下都可以识别
#尺度空间的获取 : 通常 使用高斯模糊 来实现 !!!
# ---------------------------------------------------------  SIFT 函数  [关键点绘制]
# img = cv.imread('666.jpg')
# img = cv.resize(img,(500,500))
# gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#
# sift = cv.xfeatures2d.SIFT_create()    # 现在用不了了 !!【 受专利保护 !!!】
# kp = sift.detect(gray,None)
#
# img = cv.drawKeypoints(gray,kp,img) # 绘制关键点 !!!
# cv.imshow('Keypoints',img)
# cv.waitKey(0)
# cv.destroyAllWindows()
#
# kp,des = sift.compute(gray,kp)   # 第一个 :关键点的 个数
# print(np.array(kp).shape)
#
# print(des.shape)  # [默认长度 :128维]

# ------------------------------------------------------Brute - Force 蛮力匹配
img1 = cv.imread('666.jpg',0)
img2 = cv.imread('666.jpg',0)

def cv_show(name,img):
    cv.imshow()
    cv.waitKey(0)
    cv.destroyAllWindows()

sift = cv.xfeature2d.SIFT_create()    # SIFT 函数  [关键点绘制]  [特征向量计算出来]

kp1,des1 = sift.detectAndCompute(img1,None)   # 比较 距离
kp2,des2 = sift.detectAndCompute(img2,None)

bf = cv.BFMatcher(crossCheck=True)  # 进行蛮力匹配

# ---------------  1对 1 的匹配
matches = bf.match(des1,des2)
matches = sorted(matches,key=lambda x: x.distance)

img3 = cv.drawMatches(img1,kp1,img2,kp2,matches[:10],None)  # 将两个图像 (对应的) 的关键点 进行连在一起

cv_show('img3',img3)

# 全景图像 : 就是很多图像 组成的  ————就是拼接起来的 !!  【就是需要 关键点拼接 !!】


# -------------------------------------   k对 最佳匹配
bf = cv.BFMatcher()

matches = bf.knnMatch(des1,des2,k=2) # 不用 1对1 ,现在是2对 2

good = []

for m,n in matches:
    if m.distance<0.75*n.distance:
        good.append([m])

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

cv_show('img3',img3)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pan_peter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值