位置: IT常识 - 正文

Susan角点检测python实现 (边缘检测、角点检测、重心计算、非极大值抑制)(角点检测算法)

编辑:rootadmin
Susan角点检测python实现 (边缘检测、角点检测、重心计算、非极大值抑制) Susan角点检测(边缘检测、角点检测、重心计算、非极大值抑制)写在前面

推荐整理分享Susan角点检测python实现 (边缘检测、角点检测、重心计算、非极大值抑制)(角点检测算法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:角点检测算子,角点检测的应用,susan角点检测算法,角点检测算子,opencv python角点检测,susan角点检测算法,角点检测函数,opencv python角点检测,内容如对您有帮助,希望把文章链接给更多的朋友!

黄宁然——看过你看过的算法,觉得好难。

参考文献镇楼

[1]https://blog.csdn.net/tostq/article/details/49305615 [2]https://blog.csdn.net/qq_45613931/article/details/117819107 [3]陈丽莉《基于SUSAN算法的角点检测》 [4]王栋、朱明《SUSAN角点探测算法分析改进》

问题来源

an***** xue100: https://bbs.csdn.net/topics/*********?spm=1001.2014.3001.**77 1)如何计算USAN区域的重心? 2)非极大值抑制,指的是若模板中心对应的灰度小于模板内的任意像素灰度,就舍弃该像素点吗? 3)几何门限g如何选取? 因“当前发帖距今超过3年,不再开放新的回复”,故新建帖子。迟到的回复。

1、原理简介

SUSAN(Smallest UnivalueSegment Assimilating Nucleus)使用一个圆形模板,通过检测模板中的像素与中心位置像素的偏离程度,来判断中心位置像素是否为边缘或角点。 模板大小:半径为3.5像素,模板内共计有37个像素。 中心思想:如果周边像素与中心位置像素偏差较小,则认为周边像素与中心位置像素相似,中心位置为非边缘;如果周边像素与中心位置偏差较大,则认为中心位置为边缘或角点。

2、基本实现步骤(1)相似判断

(式1) I(r0)为中心位置像素,I( r)为周边位置像素,t像素偏差阈值,c为布尔结果,表示相似或不相似。 关于阈值t:可见,t越大,周边像素越容易与中心位置像素“相似”,越不容易被判定为边缘或角点,即将获得较少的角点。相关文献说,t值影响的是角点检测的数量[1]。

(2)平滑曲线进行相似判断

实际中,使用平滑曲线来求c (式2)

(3)累计相似度

对于圆形模板区域,共计37个像素,周边36个像素与中心位置像素进行对比,可以得到该中心位置的36个c。对这36个c进行累加,得到该中心位置的累计相似度: (式3) 显然,n越大,越不可能是边缘、角点。

(4)初始边缘响应/角点Susan角点检测python实现 (边缘检测、角点检测、重心计算、非极大值抑制)(角点检测算法)

这里,再引入一个阈值g,通过判断n与g的大小,来得到该中心位置属于边缘或角点的可能性。 (式4) 可见,若n大于g,则R为0,表示该中心位置为非边缘(非角点);如果n小于g,R取值为(g-n),含有取负操作。故R值越大,该中心位置为边缘或角点的可能性就越大。

关于阈值g:g的取值越小,对角点检测越挑剔。文献[1]阐述,g影响角点检测的质量。g的取值,文献[1]阐述可以取max(n)的0.75倍;有的程序代码中,直接取值37/2。具体取值,应该需要针对具体场景进行调试。

3、python代码实现3.1 圆形掩模def get_susan_mask(): mask=np.ones((7,7)) mask[0,0]=0;mask[0,1]=0;mask[0,5]=0;mask[0,6]=0; mask[1,0]=0;mask[1,6]=0; mask[5,0]=0;mask[5,6]=0;mask[6,0]=0;mask[6,1]=0; mask[6,5]=0;mask[6,6]=0; return mask

该程序返回的mask如下: 为1的位置,即是圆形模板区域。

3.2 susan角点检测def susan_corner_detect(img_src,t=10): susan_mask = get_susan_mask() img = img_src.copy() row_s,col_s = 3,3 row_e,col_e = img_src.shape[0]-3,img.shape[1]-3 n_max = 0 n_arr=37*np.ones(img.shape) # 初始认为没有角点 for r in range(row_s,row_e):#遍历所有行 for c in range(col_s,col_e):#遍历所有列 susan_zone = img[r-3:r+3+1,c-3:c+3+1]#获取矩形区域 susan_zone = susan_zone[susan_mask!=0]#使用mask截取圆形区域 r0 = img[r,c] similarity = np.exp(-((1.0*susan_zone-r0)/t)**6 ) n=np.sum(similarity) if n>n_max: n_max = n n_arr[r,c] = n g = n_max /2 R = np.zeros(img.shape) index = n_arr<g #小于g,认为是可能的角点,越小,可能性越大 R[index] = g-n_arr[index] # 取反,所以R越大,是角点的可能性越大 plt.figure() plt.title("edge") plt.imshow((6.37 * n_arr).astype(np.uint8), cmap=cm.gray) return R3.3 检测结果

取t=10,g= n_max /2。 主程序中,调用算法:

if __name__ == '__main__': img_src = cv2.imread('susan_input1.png',-1) if len(img_src.shape)==3: img_src = cv2.cvtColor(img_src,cv2.COLOR_BGR2GRAY) corner = susan_corner_detect(img_src) img_show = cv2.cvtColor(img_src, cv2.COLOR_GRAY2BGR) img_show[corner != 0] = (255, 0, 0) plt.figure() plt.title("original corners") plt.imshow(img_show, cmap=cm.gray) plt.show()

4、重心法去除伪角点

从上图的角点检测结果来看,原始角点中存在较多冗余角点,或伪角点。 采用重心法去除。 根据文献1,求取重心 (式5) 上式中,r为位置,实际为(x,y)两轴构成。计算时,先计算x方向重心,再计算y方向重心。对公式的简言之:圆形模板中心位置周边有36个像素,相应的有36个c,在求x方向重心Gx时,将36个位置的x坐标与相应的c相乘后累加,再除以sum( c),即可得到Gx;同理得Gy。另外,对于r0,可假设其位置为(0,0)。 在求得重心后,计算重心与中心位置的距离,根据文献[3]描述,如距离较小,则认为中心位置不是角点。根据文献[4],该距离阈值设置为1.8。本文采用1.5。另,重心法去除伪角点与初始角点的检测,在代码实现时,有些许内容的重复,所以在初始角点检测时,即可同步应用重心法。

4.1重心法代码def gravity_filter(img_src,corner_src,t=10,F=1.5): x_label = np.zeros((7,7)) y_label = np.zeros((7,7)) x_label[:,0]=-3;x_label[:,1]=-2;x_label[:,2]=-1; x_label[:, -1] = 3; x_label[:, -2] = 2; x_label[:, -3] = 1; y_label[0,:]=-3;y_label[1,:]=-2;y_label[2,:]=-1; y_label[4, :] = 1;y_label[5, :] = 2; y_label[6, :] = 3; print(x_label,"\r\n",y_label) #查看矩形区域内x、y轴信息 img = img_src.copy() row_s, col_s = 3, 3 row_e, col_e = img_src.shape[0] - 3, img.shape[1] - 3 corner = corner_src.copy() susan_mask = get_susan_mask() for r in range(row_s,row_e): for c in range(col_s,col_e): if corner[r,c] ==0: #对于不是角点的位置,就没必要进行后续计算了 continue susan_zone = img[r-3:r+3+1,c-3:c+3+1]#获取矩形区域 r0 = img[r,c] similarity = np.exp(-((1.0*susan_zone-r0)/t)**6 ) g_x = np.sum(similarity[susan_mask==1]*x_label[susan_mask==1] )/np.sum(similarity[susan_mask==1])#使用mask截取圆形区域 g_y = np.sum(similarity[susan_mask == 1] * y_label[susan_mask == 1]) / np.sum(similarity[susan_mask == 1])#使用mask截取圆形区域 distance = np.sqrt(g_x**2+g_y**2) if distance<F: corner[r,c] = 0 return corner4.2 主程序调用if __name__ == '__main__': img_src = cv2.imread('susan_input1.png',-1) if len(img_src.shape)==3: img_src = cv2.cvtColor(img_src,cv2.COLOR_BGR2GRAY) corner = susan_corner_detect(img_src) img_show = cv2.cvtColor(img_src, cv2.COLOR_GRAY2BGR) img_show[corner != 0] = (255, 0, 0) plt.figure() plt.title("original corners") plt.imshow(img_show, cmap=cm.gray) cor_g = gravity_filter(img_src, corner) img_show2 = cv2.cvtColor(img_src, cv2.COLOR_GRAY2BGR) img_show2[cor_g != 0] = (255, 0, 0) plt.figure() plt.title("corners-gravity ") plt.imshow(img_show2, cmap=cm.gray)plt.show()4.3 检测结果

与原始角点的局部对比

5、非极大值抑制

非极大值抑制,也可对角点进行剔除。 思想:对于已获取的角点矩阵,使用一3x3的矩形区域进行逐个判断。在3x3的区域中,若中心位置不是最大,则认为该中心位置不是局部极值,即认为该中心位置不是角点,将其抑制。 问题:若3x3区域内,有两个位置的值相等且均为最大,则如何处理?目前,本文2个均保留。 220719更新:该nms代码存在些许不足之处,详见后续的博文,https://blog.csdn.net/xiaohuolong1827/article/details/125859795

5.1 非极大值抑制代码def corner_nms(corner,kernal=3): out = corner.copy() row_s = int(kernal/2) row_e = out.shape[0] - int(kernal/2) col_s,col_e = int(kernal/2),out.shape[1] - int(kernal/2) for r in range(row_s,row_e): for c in range(col_s,col_e): if corner[r,c]==0: #不是可能的角点 continue zone = corner[r-int(kernal/2):r+int(kernal/2)+1,c-int(kernal/2):c+int(kernal/2)+1] index = corner[r,c]<zone (x,y) = np.where(index==True) if len(x)>0 : #说明corner[r,c]不是最大,直接归零将其抑制 out[r,c] = 0 else: out[r,c] = 255 return out5.2 主程序调用if __name__ == '__main__': img_src = cv2.imread('susan_input1.png',-1) if len(img_src.shape)==3: img_src = cv2.cvtColor(img_src,cv2.COLOR_BGR2GRAY) corner = susan_corner_detect(img_src) img_show = cv2.cvtColor(img_src, cv2.COLOR_GRAY2BGR) img_show[corner != 0] = (255, 0, 0) plt.figure() plt.title("original corners") plt.imshow(img_show, cmap=cm.gray) cor_g = gravity_filter(img_src, corner) img_show2 = cv2.cvtColor(img_src, cv2.COLOR_GRAY2BGR) img_show2[cor_g != 0] = (255, 0, 0) plt.figure() plt.title("corners-gravity ") plt.imshow(img_show2, cmap=cm.gray) cor_g_nms = corner_nms(cor_g) img_show3 = cv2.cvtColor(img_src, cv2.COLOR_GRAY2BGR) img_show3[cor_g_nms != 0] = (255, 0, 0) plt.figure() plt.title("corners-gravity-nms ") plt.imshow(img_show3, cmap=cm.gray) plt.show()5.3 检测结果

与重心法处理后的局部对比

6. 源码下载:

https://download.csdn.net/download/xiaohuolong1827/85030525

7. 其他

2022.03.22,黄宁然:“SUSAN,你竟然在看这个,我以前用过,你信不信”。呃,我当然信。

本文链接地址:https://www.jiuchutong.com/zhishi/300502.html 转载请保留说明!

上一篇:〖大前端 - 基础入门三大核心之CSS篇㉒〗- 过渡属性的基本使用(大前端技术架构)

下一篇:语音处理/语音识别基础(六)- 语音的端点检测(EPD/VAD)(语音语言)

  • ipad2021分屏使用教程(ipad分屏怎么使用)

    ipad2021分屏使用教程(ipad分屏怎么使用)

  • 钉钉直播提示音怎么设置(钉钉直播提示音在哪里)

    钉钉直播提示音怎么设置(钉钉直播提示音在哪里)

  • 华为mate20pro可以用无线充电吗(华为mate20pro可以扩展内存吗)

    华为mate20pro可以用无线充电吗(华为mate20pro可以扩展内存吗)

  • 充电宝3c认证图标(充电宝3c认证图片)

    充电宝3c认证图标(充电宝3c认证图片)

  • 多闪怎么看别人发的视频(多闪怎么查看好友的动态)

    多闪怎么看别人发的视频(多闪怎么查看好友的动态)

  • 剪映音乐解析失败(剪映音乐解析失灵怎么办)

    剪映音乐解析失败(剪映音乐解析失灵怎么办)

  • 双重认证查找定位会提示吗(开启双重认证怎么查找位置)

    双重认证查找定位会提示吗(开启双重认证怎么查找位置)

  • 连接itunes什么意思(nga怎么拼读)

    连接itunes什么意思(nga怎么拼读)

  • 虎牙怎么升级粉丝牌子(虎牙怎么升级粉丝)

    虎牙怎么升级粉丝牌子(虎牙怎么升级粉丝)

  • 华为nova7和nova7se的区别(华为的nova7和nova7se哪个好)

    华为nova7和nova7se的区别(华为的nova7和nova7se哪个好)

  • a1491是ipad几(平板a1491是ipad几代?)

    a1491是ipad几(平板a1491是ipad几代?)

  • 淘宝差价多久内可以退(淘宝差价金额是固定不变的吗)

    淘宝差价多久内可以退(淘宝差价金额是固定不变的吗)

  • 优酷弹幕怎么没了(优酷弹幕怎么没有了电脑显示)

    优酷弹幕怎么没了(优酷弹幕怎么没有了电脑显示)

  • 正交模式打开的主要作用是什么(正交模式打开的三种方法)

    正交模式打开的主要作用是什么(正交模式打开的三种方法)

  • qq轮船只能有一个吗(qq轮船可以单方面消失吗)

    qq轮船只能有一个吗(qq轮船可以单方面消失吗)

  • 快手b类有什么影响(快手b类包括什么)

    快手b类有什么影响(快手b类包括什么)

  • 华为p30为什么老是卡(华为p30为什么老是自动调亮度)

    华为p30为什么老是卡(华为p30为什么老是自动调亮度)

  • 华为mate30pro出厂带膜吗(华为mate30pro出厂价多少钱)

    华为mate30pro出厂带膜吗(华为mate30pro出厂价多少钱)

  • iphone手机自动亮度怎么关(苹果手机自动亮起来)

    iphone手机自动亮度怎么关(苹果手机自动亮起来)

  • 荣耀20i如何下三键(荣耀20i手机下载设置)

    荣耀20i如何下三键(荣耀20i手机下载设置)

  • 小米智能锁sn码在哪(小米智能锁sn码是什么意思)

    小米智能锁sn码在哪(小米智能锁sn码是什么意思)

  • 如何将电脑格式化(如何将电脑格式化win7)

    如何将电脑格式化(如何将电脑格式化win7)

  • 18瓦快充是什么意思(18瓦快充好还是20瓦快充好)

    18瓦快充是什么意思(18瓦快充好还是20瓦快充好)

  • 天猫88折卡如何获取(天猫88折vip卡什么样的商品使用)

    天猫88折卡如何获取(天猫88折vip卡什么样的商品使用)

  • 索尼xperia1如何开启开发者选项

    索尼xperia1如何开启开发者选项

  • oppok1返回键在哪(oppo k1返回键怎么设置)

    oppok1返回键在哪(oppo k1返回键怎么设置)

  • Windows11安装不了是怎么回事?Win11系统不能安装的原因以及图文解决方法(Windows11安装不了空件怎么处理)

    Windows11安装不了是怎么回事?Win11系统不能安装的原因以及图文解决方法(Windows11安装不了空件怎么处理)

  • 北方针叶林中的欧洲棕熊幼崽,芬兰 (© Jules Cox/Minden Pictures)(北方针叶林的特征有哪些?)

    北方针叶林中的欧洲棕熊幼崽,芬兰 (© Jules Cox/Minden Pictures)(北方针叶林的特征有哪些?)

  • netplan命令  网络参数配置工具(网络命令netstat)

    netplan命令 网络参数配置工具(网络命令netstat)

  • CIA是指什么会计考试
  • 小型微利企业企业所得税优惠政策2021年
  • 一张发票能分开做帐务处理吗
  • 广告公司个体户自己可以开发票
  • 收回已核销的坏账什么意思
  • 暂估工资成本
  • 增值税组成计税价格包括消费税吗
  • 小企业固定资产折旧方法
  • 劳务发票未收到做账
  • 企业收到工程款开发票要扣哪些税
  • 留抵税额注销时,会计分录
  • 税控设备可以跨省销售吗
  • 没有业务来往可以报税吗
  • 审计风险可控吗
  • 暂估入库库存出现负数怎么办?
  • 财产转移数据缴费怎么交
  • 降低增值税税率对消费者的影响有哪些
  • 出口货物免抵退税额确认会计分录
  • 无法取得房地产原值怎么缴纳房产税?
  • 周转材料月末有余额吗
  • 运输公司转包业务怎么开票
  • 鸿蒙系统小艺怎么改声音
  • 无线路由器如何桥接wifi信号
  • 收到发票已入账,退回怎么做账
  • 增值税专用发票上注明的价款含税吗
  • 公司作为股东有什么好处
  • 退货时会计分录的银行存款能是负数吗
  • 二手设备账务处理
  • 辛华达瀑布,加拿大贾斯珀国家公园 (© Schroptschop/Getty Images)
  • 文件上传漏洞及解决方案
  • php统计目录中文怎么写
  • 融资性售后回租承租方为什么不交税
  • 怎么把vue项目跑起来
  • php登录注册整套源码
  • php时间戳转换成时间
  • 接受赠品怎么做账
  • wordpress怎么用
  • 利息收入的会计科目怎么做
  • 不动产固定资产清理
  • 运输发票税金如何入账
  • mongodb数据查询
  • 改签费可以进项转出吗
  • 财务报告与财务思维
  • 支付员工的餐费怎么入账
  • 土增清算后再销售
  • 所得税申报表的营业成本包括哪些
  • 小规模纳税人补开发票如何申报
  • 稳岗补贴支付范围
  • 棚户区改造国家给政府拨款吗
  • 长期股权投资稀释股权
  • 将资产货物用于职工福利
  • 记账凭证应该是
  • 印花税的减免
  • 对于审核后的凭证可直接修改对吗
  • 应交所得税科目期末是不是应该没有余额
  • 不开票收入怎么做账
  • 营改增后被挂靠的企业如何做账?
  • 商业企业进货会计分录
  • 快速插入大量数据的asp.net代码(Sqlserver)
  • Win7 64位系统XP模式失效的原因及解决方法
  • windowsserver2008远程桌面怎么打开
  • freebsd 添加用户
  • 方正怎么从u盘进pe
  • windows右下角
  • win10一年更新几次
  • npssvc.exe - npssvc是什么进程 有什么用
  • 电脑禁用u盘软件
  • iwatch命名
  • linux必会的20种服务
  • android:ViewPager与FragmentPagerAdapter
  • glClearBufferSubData
  • android 滚动选择器
  • unity 位图字体
  • shell打开日志文件
  • 开源安卓app
  • 举例说明jquery的功能
  • js数组排序方法sort
  • android原生框架
  • 厦门市地方税务局市稽查局关于规范稽查有关规定
  • 什么是美国注册公司
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设