第六章 图像特征


前言

上一章我们讲解了图像处理相关的内容,包括图像金字塔、图像轮廓、模板匹配、直方图、傅里叶变换等内容。本章我们将要讲解图像特征相关的内容。

一、角点检测

1.1 角点

  • 定义: 两条边的交点,或者说角点的局部领域应该具有两个不同区域的不同方向的边界。角点是图像中一个突出的局部特征,可以用于特征提取、目标识别和定位等任务。
    在这里插入图片描述

1.2 原理

在这里插入图片描述

  • 基本思想: 角点周围的灰度值变换肯定较大
  • 检测原理: 使用一个滑动窗口在灰度图上进行任意方向上的滑动,比较滑动前与滑动后两个位置的灰度值:
    • 几乎没什么变化:滑动窗口处于颜色填充区域,如左上图。
    • 只在一个方向有有较大变化:滑动窗口处于图像中轮廓的边缘,例如上图中间。
    • 各个方向变换剧烈:滑动窗口极有可能处于角点位置。如右上图。

1.3 Harris算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.4OpenCV代码

cv2.cornerHarris是OpenCV中用来检测图像角点的函数。其函数原型如下:

dst = cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])

其中:

  • src:输入图像,应该是灰度图像,数据类型为float32
  • blockSize:角点检测中要考虑的领域大小。
  • ksizeSobel求导中使用的窗口大小。
  • k:角点检测方程的自由参数,取值范围为0.040.06 R指标的k值。
  • dst:输出图像,数据类型为float32,与src大小相同。
  • borderType:处理边缘像素时指定的边缘类型,默认为cv2.BORDER_DEFAULT

函数的作用是对输入图像进行角点检测,输出角点响应值图像。dst中的每个像素对应输入图像的一个像素,在像素点(x, y)处的响应值为该像素周围的梯度变化情况。

import cv2
import numpy as np
img = cv2.imread('./card.jpg')
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# blockSize: 滑动窗口
# ksize:sobel 算子计算梯度的卷积核尺寸
# k:R系数的k值
# cornerHarris(src:np.float32, blockSize:int, ksize:int, k[, dst[, borderType]]) -> dst
imgGray = np.float32(imgGray)
dst = cv2.cornerHarris(imgGray,2,3,0.04)
# 标记出角点
img[dst > 0.1 * dst.max()] = [0,0,255]
cv2.imshow('test',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

二、SIFT算法

先略过 后面再补

三、BF特征匹配

BF特征匹配是一种基础的计算机视觉算法,用于图像匹配和目标检测。它的全称是布里夫特描述符匹配算法(Brute-Force Descriptor Matcher),简称BF匹配算法。

BF特征匹配算法使用布里夫特描述符(Brute-Force Descriptors)来描述图片特征,这些特征可以是角点、边缘等。这些描述符可以根据图像的局部特征来描述图片,与图像的全局信息并没有太大关系。

在BF特征匹配算法中,对每个特征点求出其描述符,然后将其与参考图像中的所有特征描述符逐一进行匹配,找出最佳匹配结果。

虽然BF特征匹配算法很简单,但由于其遍历所有特征点进行匹配,因此它的时间复杂度较高,对于大规模图像处理任务来说不太适用。

3.1 理论

  • 思路: 暴力匹配,遍历两张图片关键点的描述符,然后比较两个描述符之间的差异,例如计算两个描述符之间的距离。
  • 交叉检测(crossCheck): 蓝色图的关键点A与紫色图的关键点B匹配时,A描述符与紫图中所有描述符最接近的点是B,同时B描述符与蓝图中所有描述符最接近的点也要是A, 这样才认为A点与 B点匹配。

在这里插入图片描述

sift = cv2.SIFT_create()
kp1,des1 = sift.detectAndCompute(img1Gray,None)
kp2,des2 = sift.detectAndCompute(img2Gray,None)
# 建立匹配算法
# normType:两个描述符距离的计算方式,默认为 cv2.NORM_L2,两个坐标的欧式距离 
# cv2.BFMatcher(normType, crossCheck)
bf = cv2.BFMatcher(crossCheck=True)
# 匹配
# imgSrc:被匹配的图片
# imgTemp:模板
# res:DMatch类型的数组
# match(imgSrc,imgTemp) -> res:list
matchRes = bf.match(des1,des2)
matchRes = sorted(matchRes,key=lambda x:x.distance)
# 绘制匹配
# drawMatches(img1, keypoints1, img2, keypoints2, matches1to2, 
#           outImg[, matchColor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg
imgMatch = cv2.drawMatches(img1,kp1,img2,kp2,matchRes[:15],None,flags=2)

总结

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值