网络编程
位置:首页>> 网络编程>> 网络编程>> OpenCV角点检测的实现示例

OpenCV角点检测的实现示例

作者:山居秋暝LS  发布时间:2023-06-25 06:49:10 

标签:OpenCV,角点检测

Harris 角点检测算法

1. 角点

角点是水平方向、垂直方向变化都很大的像素。

角点检测算法的基本思想: 

        使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。

        目前,角点检测算法还不是十分完善,许多算法需要依赖大量的训练集和冗余数据来防止和减少错误的特征的出现。对于角点检测算法的重要评价标准是:其对多幅图像中相同或者相似特征的检测能力,并且能够应对光照变化、或者图像旋转等影响。

关于角点的具体描述可以有几种:

  • 一阶导数(即灰度的梯度)的局部最大所对应的像素点;

  • 两条及两条以上边缘的交点;

  • 图像中梯度值和梯度方向的变化速率都很高的点; 

  • 角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。                                                                                     

三类角点检测算法:

  • 基于二值图像的角点检测;

  • 基于轮廓曲线的角点检测;

  • 基于灰度图像的角点检测:基于梯度、基于模板和基于模板和梯度组合三类方法;常见的基于模板的角点检测算法有:Kitchen-Rosenfeld角点检测算法,Harris角点检测算法,KLT角点检测算法及SUSAN角点检测算法。基于模板的方法主要是考虑像素领域点灰度的变化,即亮度的变化。

2. 流程

(1)找出角点
用高斯算子求出像素水平方向和垂直方向的梯度dx, dy,–> 对梯度的平方dxdx ,dydy, dxdy滤波得到Wxx ,Wxy,Wyy --> 在求的(WxxWyy - Wxy**2)/(Wxx + Wyy)作为候选角点。

(2)筛选角点
根据阈值筛选角点–> 取得角点的坐标 -->根据角点坐标得到角点所在的行 --> 在角点周围,删除掉其他角点。–> result

(3)标记角点

3. 实现

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import filters

## 1.找出角点
### 1.1 步骤:img求导 --> imx ,imy 滤波-->Wxx ,Wxy,Wyy --> (Wxx*Wyy - Wxy**2)/(Wxx + Wyy)
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
    return  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.nonzero()).T  # 取候选角点的坐标

    values = [harri[i[0],i[1]] for i in cords]  # 候选角点的值
    cls = np.argsort(values)     # 对角点排序得到排序后的序列号,序列号也是候选角点所在的行

    loc = np.zeros(harri.shape)   # 划出可行性区域
    loc[min_dist:-min_dist,min_dist:-min_dist] = 1

    re_cords = []
    for i in cls:  # 筛选角点。先取出角点,角点周围的点不再取出
        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
    return re_cords

def plot_harri(img,cords):
    plt.figure()
    plt.gray()
    plt.imshow(img)
    plt.plot([i[1] for i in cords],[i[0] for i in cords],'.')
    plt.axis('off')
    plt.show()

## 3 测试
if __name__ == '__main__':
    img = np.array(Image.open('luna.png').convert('L'))
    harri = compute_harris_response(img)
    re_cords = get_harris_points(harri)
    plot_harri(img,re_cords)

来源:https://blog.csdn.net/qq_35732321/article/details/123717928

0
投稿

猜你喜欢

  • 双击编辑功能如何实现:例如:标题  (鼠标双击“标题”文字 即出现可编辑的输入框形式及提交按钮) <!D
  • Opera, 作为 A-Grade 浏览器,在现在的前端开发中务必支持。它很优秀,很不幸,bug是每个浏览器都不可避免的问题,Opera亦难
  • java JSP开发之Spring中Bean的使用在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例
  • 删除单条记录 代码如下:id = saferequest("id") sql="
  • 原作者:Jason MannInternet Magazine showed that people do not read on the
  • 代码如下:<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001&quo
  • HTML5,被传为Flash 的杀手,是一种用于web 应用程序开发、具有变革意义的网络技术。HTML 5提供了一些新的元素和属性,其中有些
  • jquery有一个插件叫Timer,很有意思,咱来实现一个简版的yui3的node timer。但还是应当首先交代下yui3的node扩展的
  • 见过很多网站,在设计的时候给了用户很大的自由度,我个人并不赞同这种做法。最简单的例子,圈网。我在研究圈网的时候注册完成后圈网给了我一个搜索框
  • javascript可以根据输入值自动搜索显示相关的select列表,对于列表很长时可以很方便的查找到要的值。js代码:<script
  • 可以实现,下面我们就来做一个检测一个字符串在另一个字符串当中出现几次的函数:入口参数:TheChar="要检测的字符串"
  • 你和用户之间的网站堆栈(简化版)在TXJS大会的最后一天,一个开发者问我:面向对象的CSS没有给你留下一大堆基于表现的class名?网络堆栈
  • 众所周知,凡是用 FrontPage 做的网页里面都有类似这样的标记:<META content="Microso
  • SQL Server 2008已经发布,我们可以看到它在各方面都有了显著的进步,这些让人侧目之处和失望之处都有可能极大地影响大型企业的采购意
  • 举个例子来说,要查找出2007-10-12至2007-10-31之间在网站上注册的会员,选择好日期后,点击“查询”按钮,发现2007-10-
  • 之前看到很多人一直都问这个问题,不过当时我没当一回事,因为在 CSS 中要垂直居中,多数是在有高度的情况下,或者容器高度不定的情况下才用,看
  • 这次我们讨论的是,区分有单选框的选项和普通的选项~~乍听起来,可能不太理解我说了什么,下面举个例子先~~1、标签的单选~~例如QQ秀的支付流
  • 可视性的问题几乎在每次不同产品的用户测试中都会出现:用户总是对页面的某些元素、功能视若无睹,或根本无视。基于此,对这个问题进行了一番小小的研
  • Css Reset是什么? 有些同行叫 "css复位",有些可能叫 "默认css".....相信看完
  • 本文说明向外扩展数据库系统的两个选项,从而实现更高的可扩展性:水平数据划分和垂直数据划分当我提到向外扩展数据库系统时,我实际上只是讨论对数据
手机版 网络编程 asp之家 www.aspxhome.com