CV——Feature Analysis(harris)
Feature Analysis(1)
——学自北京大学林金龙老师
Point(Patch) Features
我们怎么对齐上面两张图片呢?
有这样的思路:
- 检测出两张图片中的特征点,如下图:
- 找到相互对应的一对,如下图:
- 但是存在一些问题:
我们需要一个可重复利用的检测器以在两张图片中独立地检测出相同的点。
我们需要一个可靠且独特的描述符去准确识别出在一张图片中的一点在另一张图片中的对应点。 - 特征点的要求
几何变换不变性
光照不变性
抗噪声和模糊
Harris角点检测
何谓角点
上图红色标记的点为角点,不明白可以继续看,角点可以通过小窗口来识别,如下图:
角点是处于无论窗口往哪个方向移动,窗口内的像素值都有很大的变化的窗口。对于上图,蓝色窗口无论往哪个方向移动像素值都不会有变化,黑色窗口水平方向移动像素值不会有变化,而有角点的红色窗口无论往哪个方向移动,像素值都变化很大。
原理
将窗口向各个方向移动(u,v)然后计算所有差异的总和E(u,v),其中窗口函数可以是正常的矩形窗口,也可以是给予每个像素权重的高斯窗口。
我们知道,角点区域向任何方向移动,像素值变化很大,所以我们要最大化E(u,v),也就是最大化上式中的第二项,如下图:
所以E(u,v)的大小取决于M
由上图我们可以知道,主导梯度方向是与x轴和y轴对其的,所以有:
- 如果λ1和λ2都很小的话,说明这个窗口类似于上文说的蓝色窗口,处于平滑区域;
- 如果λ1>>λ2或者λ1<<λ2的话,说明这个窗口类似于上文说的黑色窗口,处于边缘;
- 如果λ1和λ2都很大且处于同一个数量级的话,则说明这个窗口类似于上文说的红色窗口,包含角点。
我们采用了这样一个公式来给窗口进行打分,以描述上述的情况:
检测过程:
- RGB -> GRAY(灰度图)
- GRAY -> Ix,Iy -> λ
- λ -> R -> 阈值处理(R>Threshold)
- 找到局部R最大点
- 可视化
附上代码:
import cv2
import numpy as np
filename = 'crossbar.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow("crossbar",gray)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04)
#result is dilated for marking the corners, not important
dst = cv2.dilate(dst,None)
# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.01*dst.max()]=[0,0,255]
cv2.imshow('dst',img)
cv2.imwrite("chess_harr.jpg",img)
while 1:
key = cv2.waitKey(1)
if key>0:
break
cv2.destroyAllWindows()
cv2.cornerHarris(img,blockSize,ksize,k)
- img - 数据类型为float的输入图像
- blockSize - 角点检测中要考虑的领域大小
- ksize - Sobel 求导中使用的窗口大小
- k - 打分公式中的α∈[0.04,0.06]
- Return - R值构成的灰度图像,与原图对应
作者:其实是个驴
参考:
课件
https://www.cnblogs.com/DOMLX/p/8763369.html