???欢迎来到本博客???
本次博客内容将继续讲解关于OpenCV的相关知识
?作者简介:⭐️⭐️⭐️目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉python网页爬虫、机器学习、计算机视觉(OpenCV)、群智能算法。然后正在学习深度学习的相关内容。以后可能会涉及到网络安全相关领域,毕竟这是每一个学习计算机的梦想嘛!
?目前更新:???目前已经更新了关于网络爬虫的相关知识、机器学习的相关知识、目前正在更新计算机视觉-OpenCV的相关内容。???本文摘要???
本次博客我们介绍一下关于图像特征检测的全部过程
⭐️项目前言
⭐️图像特征检测Harris原理
- 角点:在图像的角度来看,无论是沿着水平方向还是竖直方向进行移动时候,灰度级会发生变化,而且这个变化是非常迅速的,我们称这个图像就是一个角点。
- 边界:在图像的角度上来看,指把图像按照水平或者垂直方向移动的时候,只有一个一个方向变化的比较明显,另一个方向变化就比较微弱,这样的我们就称之为边界。
- 平面:平面就是说无论向垂直方向还是水平方向移动,图像的灰度值都不会发生迅速的变化,这个就是平面。

原理图,这里第一个图表示的就是平面灰度值没有明显变化,第二个图就是要给边界灰度值水平方向变化明显垂直方向灰度值变化并不明显,第三个图表示的就是一个角点,无论水平还是垂直方向都很明显。主要看灰度级的变化结果:

对于图像l(x,y),当在点(x,y)处平移(▲x,▲y)后的图像灰度级的相似性是:

这里就是w(u,v)表示权重矩阵,而I就表示图像的灰度级后面表示图像灰度值的差值,变化程度。假设图像l(x,y)为3*3,那么就有9个像素点x1-x9,当移动之后,那么我们就得到了一个新的像素点集合z1-z9,我们要对其进行一个像素值的减法操作。其中W(u,v)表示权重矩阵项,他是一个以(x,y)为中心的一个窗口,可以是常数也可以是高斯加权函数。

在OpenCV当中我们使用,cv2.cornerHarris()来进行角点检测。
其中参数都有:
- img: 数据类型为 float32 的入图像
- blockSize: 角点检测中指定区域的大小
- ksize: Sobel求导中使用的窗口大小
- k: 取值参数为 [0,04,0.06]
我们使用几个小图像去做一下角点检测:
import cv2 import numpy as np img = cv2.imread('white-black.webp') print ('img.shape:',img.shape) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # gray = np.float32(gray) dst = cv2.cornerHarris(gray, 2, 3, 0.04) print ('dst.shape:',dst.shape) img[dst>0.01*dst.max()]=[0,0,255] cv2.imshow('dst',img) cv2.waitKey(0) cv2.destroyAllWindows() 

⭐️图像特征检测SIFT原理
import cv2 import numpy as np img = cv2.imread('test_1.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.__version__ sift = cv2.SIFT_create() kp = sift.detect(gray, None) img = cv2.drawKeypoints(gray, kp, img) cv2.imshow('drawKeypoints', img) cv2.waitKey(0) cv2.destroyAllWindows() kp, des = sift.compute(gray, kp) print (np.array(kp).shape) des.shape des[0]
⭐️图像特征匹配实战

import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inline img1 = cv2.imread('box.png', 0) img2 = cv2.imread('box_in_scene.png', 0) def cv_show(name,img): cv2.imshow(name, img) cv2.waitKey(0) cv2.destroyAllWindows() cv_show('img1',img1) cv_show('img2',img2) sift = cv2.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) bf = cv2.BFMatcher(crossCheck=True)


首先我们导入一个具体图像和一个整体图像,用于做特征匹配。原理就是使用sift分别识别处关键点,然后对关键点进行一个匹配。我们具体看一下实战结果。kp1, des1 = sift.detectAndCompute(img1, None)这里我们得到关键点和向量信息,得到特征向量。然后使用特征向量进行匹配。bf = cv2.BFMatcher(crossCheck=True)crossCheck表示两个特征点要互相匹,例如A中的第i个特征点与B中的第j个特征点最近的,并且B中的第j个特征点到A中的第i个特征点也是
NORM_L2: 归一化数组的(欧几里德距离),如果其他特征计算方法需要考虑不同的匹配计算方式。
matches = bf.match(des1, des2) matches = sorted(matches, key=lambda x: x.distance)
对关键点进行一一匹配。一对一匹配。
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None,flags=2) cv_show('img3',img3)

然后一对多进行匹配。
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) cv_show('img3',img3)

一个点对应最近的两个点。
然后我们又做了一个图像的特征匹配。一对一的。

然后我们做了我的特征匹配。

最终的结果是:

多匹配的结果是

?支持:???如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦!这就是给予我最大的支持!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217725.html原文链接:https://javaforall.net
