opencv角点检测识别形状识别,python opencv角点检测
拐角通常被定义为两条边的交点。本文主要介绍OpenCV角点检测的实现实例,通过实例代码详细介绍,具有一定的参考价值。感兴趣的朋友可以参考一下。
目录
哈里斯角点检测算法1。角点检测算法的基本思想:2 .流程3。履行
Harris 角点检测算法
1. 角点
角是在水平和垂直方向上变化很大的像素。
角点检测算法的基本思想:
使用固定窗口在图像上向任意方向滑动,比较滑动前后的两种情况。如果有任何方向的滑动,有很大的灰度变化,那么我们就可以认为窗户有角落。
目前角点检测算法还不完善,很多算法需要依靠大量的训练集和冗余数据来防止和减少虚假特征的出现。角点检测算法的重要评价标准是:检测多幅图像中相同或相似特征的能力,应对光照变化或图像旋转影响的能力。
关于拐角可以有几种具体的描述:
对应于一阶导数的局部最大值(即灰度梯度)的像素;以及两条或多条边的交点;图像中梯度值和梯度方向变化率高的点;拐角处的一阶导数最大,二阶导数为零,表示物体边缘不连续变化的方向。三级角点检测算法;
基于二值图像的角点检测:基于轮廓曲线的角点检测:基于灰度图像的角点检测:基于梯度的、基于模板的以及模板和梯度的结合;常见的基于模板的角点检测算法包括Kitchen-Rosenfeld角点检测算法、Harris角点检测算法、KLT角点检测算法和SUSAN角点检测算法。基于模板的方法主要考虑像素灰度的变化,即亮度的变化。
2. 流程
(1)找出边角。
使用高斯算子找到水平和垂直梯度dx,dy,过滤梯度dxdx,dydy,dxdy的平方,以获得Wxx,Wxy,Wyy - (wxxwyy-wxxy * * 2)/(wxxwyy)作为候选角点。
(2)筛选角落
根据阈值过滤角点获取角点坐标根据角点坐标获取角点所在的行删除角点周围的其他角点。结果
(3)标出边角。
3. 实现
从PIL进口图片
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从scipy . n image导入过滤器
## 1.找出角落
### 1.1步骤:img求导- imx,imy滤波-WXX,WXY,WYY-(WXX * WYY-WXY * * 2)/(WXWY)
def compute_harris_response(img,sigma=3):
#找到梯度
imgx,imgy=np.zeros(img.shape),np.zeros(img.shape)
filters.gaussian_filter(img,(sigma,sigma),(0,1),imgx)
filters.gaussian_filter(img,(sigma,sigma),(1,0),imgy) # [260,263]
#高斯滤波梯度
wxx=filters . Gaussian _ filter(imgx * * 2,sigma)
wyy=filters . Gaussian _ filter(imgy * * 2,sigma) # [260,263]
wxy=filters . Gaussian _ filter(imgx * imgy,sigma)# [260,263]
# #寻找行列式和迹线
wdet=wxx*wyy -wxy**2
wtr=wxx wyy
返回wdet/wtr
## 2过滤器角落
### 2.1步骤:根据阈值筛选角点——获取角点坐标——根据角点坐标获取角点所在的行——
#-在拐角处,删除其他拐角。
def get_harris_points(harri,min_dist=4,threshold=0.1):
corner _ thre=Harri . max()* threshold #拐角阈值
Mask=(harri corner_thre)*1 #取出大于阈值的点作为候选角点。
Cords=np.array (mask .非零())。T #取候选角点的坐标。
Values=[Harri [I [0],I [1]] for I in records] #候选角点的值
Cls=np.argsort(values) #对角点进行排序,得到排序后的序号,这也是候选角点所在的行。
Loc=np.zeros(harri.shape) #画出可行区域
loc[min_dist:-min_dist,min_dist:-min_dist]=1
记录=[]
对于cls: #滤波器拐角中的I。先把角拿出来,角周围的点就不会再拿出来了。
if loc[cords[i,0],cords[i,1]]==1 :
re_cords.append(cords[i])
loc[cords[i,0]-min_dist:cords[i,0] min_dist,cords[i,1]-min_dist:cords[i,1] min_dist]=0
返回记录(_ u)
def plot_harri(img,cords):
图表()
plt.gray()
plt.imshow(img)
plt.plot([i[1]表示跳线中的我],[我[0]表示跳线中的我),.)
plt.axis("关")
plt.show()
## 3 测试
if __name__==__main__:
img=NP。数组(图像。开(‘露娜。png’).转换( L ))
Harri=compute _ Harris _ response(img)
记录=获取哈里斯积分(哈里斯积分)
plot_harri(img,记录)
到此这篇关于开放计算机视觉角点检测的文章就介绍到这了,更多相关开放计算机视觉角点检测内容请搜索盛行信息技术软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行信息技术软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。