一、角点特征
1、图像特征
二、Harris角点检测
1、原理
Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿着任意方向移动都会导致图像灰度的明显变化,如下图所示:
其中 I(x,y)是局部窗口的图像灰度,I(x+u, y+v) 是平移后的图像灰度, w(x, y) 是窗口函数,可以是矩形窗口,也可以是对每一个像素赋予不同权重的高斯窗口,如下所示:
推导如下:
2、Harris计算方法
角点判断:
- 当R为大数值的正数时是角点
- 当R为大数值的负数时是边界
- 当R为小数时认为是平坦区域
3、案例分析
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#imshow中文乱码解决
def zh_ch(string):
return string.encode('gbk').decode(errors='ignore')
#1、读取图像,并转换成灰度图像
img = cv.imread("./images/feilin_wz.bmp")
# img = cv.equalizeHist(img)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
#2、角点检测
#2.1 输入图像必须是float32
gray = np.float32(gray)
#2.2 最后一个参数在 0.04~0.0.05之间
dst = cv.cornerHarris(gray, 2, 3, 0.05)
#3、设置阈值,将角点绘制出来,阈值根据图像进行选择
img[dst>0.01*dst.max()] = [0,0,255]
#4、图像显示
cv.imshow(zh_ch('角点检测'), img)
cv.waitKey(0)
cv.destroyAllWindows()
# plt.figure(figsize=(10,8), dpi=100)
# plt.imshow(img[:,:,::-1])
# plt.title("Harris角点检测", fontproperties=my_font)
# plt.xticks([]), plt.yticks([])
# plt.show()
三、Shi-Tomas角点检测
1、原理
2、案例分析
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
from matplotlib import font_manager
#设置字体
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STHUPO.TTF")
#1、读取图像
img = cv.imread("images/tv-towel.jpg")
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
#2、角点问题
corners = cv.goodFeaturesToTrack(gray, 1000, 0.01, 10)
#3、绘制角点
for i in corners:
x, y = i.ravel()
cv.circle(img, (x,y), 2, (0,0,255), -1)
#4、图像显示
plt.figure(figsize=(10,8), dpi=100)
plt.imshow(img[:,:,::-1])
plt.title("shi-thomas角点检测", fontproperties=my_font)
plt.xticks([]), plt.yticks([])
plt.show()