【OpenCV 例程 300篇】249. 特征描述之视网膜算法(FREAK)

news2024/11/20 3:20:22

『youcans 的 OpenCV 例程300篇 - 总目录』


【youcans 的 OpenCV 例程 300篇】249. 特征检测之视网膜算法(FREAK)


1. FREAK 算法简介

快速视网膜算法(FREAK)算法是 Alexandre Alahi 在 ICCV 2012 的论文 FREAK: Fast Retina Keypoint 中提出的,其灵感来自人类视觉系统,通过比较视网膜采样模式的图像强度来计算二进制串的级联。。

快速视网膜关键点描述(FREAK,Fast Retina Keypoint)模拟人类视网膜的拓扑结构设计关键点的采样模式,构造二进制编码串珠外关键点的特征描述符,具有速度快、内存占用小和鲁棒性强的优点。

视觉系统基于不同尺度的高斯差分从图像中提取细节,视网膜的拓扑结构非常重要。如图16-11所示,神经细胞分为中央凹Foveal、中央凹Fovea、中心凹旁Parafoveal和中央凹周围Perifoveal的四个区域,空间分布具有中间密集、四周稀疏的特点。

在这里插入图片描述


BRISK算法的采样模式是均匀采样模式(在同一圆上等间隔的进行采样),FREAK算法采取了更为接近于人眼视网膜接收图像信息的采样模型。

人眼视网膜细胞的分布,中间密集,四周稀疏。FREAK算法的采样区域由大小不同并有重叠的同心圆构成,中心点是特征点,其它圆心是采样点。采样区域由以关键点为圆心的7 个同心圆组成。每个同心圆上各有 6个均匀分布的采样点,相邻同心圆的采样点的旋转角度交错分布,相隔30度。采样区域中共有 1+7x6=43个采样点。采样点离特征点的距离越远,采样点圆的半径越大,也表示该圆内的高斯函数半径越大。

采样像素的滤波内核半径都是各自所在同心圆半径的一半,而圆心处的特征点的滤波内核半径为1/24,一般来说,采用高斯滤波的方法效果更好。此时,滤波内核的半径就是高斯函数的标准差,均值滤波应该有着更快的特点,可以应用积分图像的方法,此时的滤波内核大小就是均值滤波的面积。


在这里插入图片描述


FREAK算法使用二进制串对特征点进行描述。

F = ∑ 0 ≤ a < N 2 a T ( P a ) T ( P a ) = { 1 , I ( P a r 1 ) − I ( P a r 2 ) > 0 0 , o t h e r w i s e F=\sum_{0 \le a\lt N}{2^a T(P_a)} \\ T(P_a) = \begin{cases} 1 &,I(P_a^{r1})-I(P_a^{r2})>0\\ 0 &,otherwise\\ \end{cases} F=0a<N2aT(Pa)T(Pa)={10,I(Par1)I(Par2)>0,otherwise
F 表示二进制描述子,Pa 表示一个采样点对,N 是二进制编码长度。 I ( P a r 1 ) I(P_a^{r1}) I(Par1) 表示采样点对Pa中前一个采样点的像素值, I ( P a r 2 ) I(P_a^{r2}) I(Par2) 表示后一个采样点的像素值。

FREAK 还将得到的 N bit的二进制描述子进行筛选降维,以获得更好和更具有辨识度的描述子。

1、建立矩阵D,D的每一行是一个FREAK二进制描述符,即每一行有N个元素。对每个特征点提取了43个采样点,可以产生 N=43*(43-1)/2=903 个采样点对,因此矩阵 D 有 903 行列。

2、对矩阵D的每一列计算其均值,由于D中元素都是0/1分布的,均值在0.5附近说明该列具有高的方差;

3、每一列都有一个均值,以均值最接近0.5的排在第一位,均值离0.5越远的排在越靠后,对列进行排序;

4、选取矩阵的前 k 列作为二进制描述符,例如 k=512。也可以是256、128、64、32等。

把得到的512个采样点对分成4组,每128个为一组,如图所示:


![在这里插入图片描述](https://img-blog.csdnimg.cn/50732fedf25d4fed976d9cfce9935d69.png#pic_center)

这四组的连线中第一组主要在外侧,之后的每组连线逐渐向内收缩,最后一组的连线主要在内侧。这与人眼视觉系统很
相似。人眼视觉系统首先通过perifoveal区域对感兴趣的物体的位置进行估计,然后通过感光细胞更加密集的fovea区域进行验证,最终确定物体的位置。

人眼的fovea区域由于有比较密集的感光细胞,可以捕捉高分辨率的图像,在识别和匹配过程中起关键作用。perifoveal区域的感光细胞则较为稀疏,只能捕捉到模糊的图像,因此首先用他们来进行物体位置的估计。这是人眼识别和匹配的原理,模仿这种流程对特征点进行匹配。

FREAK描述符的前段方差大表征粗略信息,后段方差小表征精细的高频数据。视觉系统的运行机制是先通过Perifoveal区域进行初步估计,再通过Fovea区域获取高分辨的图像。参考这种机制,FREAK实行描述符的级联匹配,先对前段的第一级进行匹配,如果匹配通过再继续下一级的匹配,这种方法显著提高了特征描述符的匹配速度。

FREAK 描述符的圆形对称采样结构使其具有旋转不变性,采样的位置半径随着尺度的变化使其具有尺度不变性,对每个采样点进行高斯模糊,也具有一定的抗噪性能,像素点的强度对比生成二进制描述子使其具有光照不变性。因此由上述产生的二进制描述子可以用来进行特征匹配。在匹配之前,再补充一下特征点的方向信息。

FREAK 比 SIFT、SURF、BRISK 算法的计算速度更快,内存负载更低,鲁棒性强,是现有算法的替代品,尤其适用于嵌入式应用。


2. OpenCV 的 FREAK 类

OpenCV提供了cv::xfeatures2d::FREAK类实现FREAK特征描述符。FREAK类继承cv::Feature2D父类,通过create静态方法创建。在Python语言中,通过接口函数FREAK.create实例化FREAK类,创建FREAK对象。

FREAK描述符是针对关键点的描述符,不涉及特征检测方法,需要配合SURF、FAST、STAR等特征检测算法,使用检测到的关键点keypoints作为输入,构造关键点描述符。

函数原型

cv.xfeatures2d.FREAK.create([, orientationNormalized, scaleNormalized=true, patternScale, nOctaves, selectedPairs])→ retval
cv.xfeatures2d.FREAK_create([, orientationNormalized, scaleNormalized=true, patternScale, nOctaves, selectedPairs]) → retval
freak.compute(image, keypoints[, descriptors]) → keypoints, descriptors

参数说明
 orientationNormalized:方向标准化设置选项,默认值为true。
 scaleNormalized:尺度标准化设置选项,默认值为true。
 patternScale:描述符模式的缩放系数,默认值为22.0。
 nOctaves:倍频程的组数,即尺度空间金字塔的层数,默认值为4。
 selectedPairs:用户指定点对的索引。
 image:输入图像,数据类型CV_8U。
 keypoints:检测到的关键点,元组。
 descriptors:关键点的描述符,形为(n,64)的Numpy 数组。

注意问题

⑴ 函数cv.FREAK_create()实例化FREAK类,定义一个FREAK类对象。默认设置尺度和方向标准化,具有尺度不变性和旋转不变性。
⑵ 描述符descriptors是FREAK特征描述符的数组,形状为(n,64),n是关键点的数量,描述符长度为64,对应于512位二进制编码。


3. 例程:特征描述之FREAK关键点描述

本例程使用STAR方法进行特征点检测,构造BRIEF关键点描述符。

# 【1611】特征描述之FREAK 描述符
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    # 读取图像
    img = cv.imread("../images/Fig1701.png", flags=1)  # 基准图像
    height, width = img.shape[:2]  # (500, 500)
    print("shape of image: ({},{})".format(height, width))

    # BRISK 检测关键点
    brisk = cv.BRISK_create()  # 创建 BRISK 检测器
    kp = brisk.detect(img)  # 关键点检测,kp 为元组
    print("Num of keypoints: ", len(kp))  # 271

    # BRIEF 特征描述
    brief = cv.xfeatures2d.BriefDescriptorExtractor_create()  # 实例化 BRIEF 类
    kpBrief, desBrief = brief.compute(img, kp)  # 计算 BRIEF 描述符
    print("BRIEF descriptors: ", desBrief.shape)  # (270, 32)

    # FREAK 特征描述
    freak = cv.xfeatures2d.FREAK_create()  # 实例化 FREAK 类
    kpFreak, desFreak = freak.compute(img, kp)  # 生成描述符
    print("FREAK descriptors: ", desFreak.shape)  # (196, 64)

    imgS = cv.convertScaleAbs(img, alpha=0.5, beta=128)
    imgKp1 = cv.drawKeypoints(imgS, kpBrief, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    imgKp2 = cv.drawKeypoints(imgS, kpFreak, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    plt.figure(figsize=(9, 3.5))
    plt.subplot(131), plt.title("1. Original")
    plt.axis('off'), plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.subplot(132), plt.title("2. BRIEF keypoints scaled")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgKp1, cv.COLOR_BGR2RGB))
    plt.subplot(133), plt.title("3. FREAK keypoints scaled")
    plt.axis('off'), plt.imshow(cv.cvtColor(imgKp2, cv.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()


在这里插入图片描述

程序说明:

  • ⑴ 运行结果如图16-12所示。子图1是原始图像,使用BRISK算法检测到271个关键点。
  • ⑵ BRIEF描述符的形状为(270,32),子图2中的圆圈表示每个关键点的尺度与方向。
  • ⑶ FREAK描述符的形状为(196,64),64表示描述符由512位二进制编码组成。子图3中的圆圈表示每个关键点的尺度与方向。


参考文献:
A Alahi,R Ortiz,P Vandergheynst, FREAK: Fast Retina Keypoint, 2012, Published in: 2012 IEEE Conference on Computer Vision and Pattern Recognition (CVPR 2012)

在这里插入图片描述

【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/128169703)
Copyright 2022 youcans, XUPT
Crated:2022-12-3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.32 Cubemx_STM32F429串口中断+空闲中断

1、简介 有时候串口接收数据时,没有帧头与帧尾,单纯使用单字节中断接收数据,不太好断帧。如果单纯使用空闲中断接收数据,当帧内数据不连续或者黏包,使用空闲中断接收就会出现接收的数据小于或者大于帧长度,比较难断帧。解决办法 方法1、单字节中断接收+空闲中断 发送命…

Spring Cache组件

《Spring Cache组件》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《Spring Cache组件》《Spring Cache组件》1. Spring Cache组件概述2. ConcurrentHashMap缓存管理3. Cacheable详解4. Caffeine缓存管理5. 缓存更新策略6. 缓存清除策略7. 多级缓存策略…

[附源码]计算机毕业设计基于Springboot景区直通车服务系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

探究商城中的在线语音谈判功能开发

近年来&#xff0c;电子商务已经成为一种新型的商业形式&#xff0c;电子商务的发展让传统的面对面谈判发展为以互联网为依托的在线沟通&#xff0c;相较于传统的谈判方式&#xff0c;在线语音谈判方式更便捷、更高效&#xff0c;逐渐成为商务谈判的主流&#xff0c;因此该功能…

FastReport Mono 2023.1 Crack

与位于 FastReport 云服务器上的报表进行交互。特征 现在支持与 FastReport Cloud 报告生成器的部分集成。改进的报告验证器包括一个带有错误编号的新的可自定义列。添加了来自 JasperReports 的模板转换器。改进的“MSChartObject”&#xff1a; 常用设置已移至单独的编辑器。…

线程池详细介绍

线程池执行流程 线程池的状态 RUNNINGSHUTDOWNSTOPTIDYINGTERMINATED 线程池优雅关闭 线程池有两个关闭方法&#xff0c;shutdown()和shutdownNow()&#xff0c;shutdown()切换到SHUTDOWN状态&#xff0c;shutdownNow()切换到STOP状态&#xff0c;当队列和线程池都为空的时候…

学习 | ANSYS经典界面在压力容器分析设计中的应用

导读&#xff1a;分析设计作为压力容器设计的重要方法&#xff0c;不仅解决了压力容器常规设计所不能解决的问题&#xff0c;而且也是压力容器设计观点与方法上的一个质的飞跃。 分析设计通常分为两类&#xff1a;应力分类法&#xff08;弹性方法&#xff09;和直接法&#xf…

基于FPGA的SD NAND图片显示实现

文章目录 0、前言 1、目标 2、图片的预处理 3、SD NAND的预处理 4、FPGA实现 4.1、详细设计 4.2、仿真 4.3、实验结果 0、前言 在上一篇文章《基于FPGA的SD卡的数据读写实现&#xff08;SD NAND FLASH&#xff09;》中&#xff0c;我们了解到了SD NAND Flash的相关知识…

大(json)文件压缩(minify)

文章目录Preface解决方案Preface 现在在做一个 GIS 地图的项目, 做过地图的应该就知道各省/市/县的json文件有多大(大部分都是经纬度数据), 就直接放前台public目录下了. 文件过大, 上传到服务器就占用很多空间, 这时候就有人提出需求, 让把这个问题处理一下. (虽然这个事情没…

mysql日志管理 、备份与恢复

目录 一、数据备份的重要性与分类 1、数据备份的重要性 2、从物理与逻辑的角度&#xff0c;备份分为 3、从数据库的备份策略角度&#xff0c;备份可分为 3.1 完全备份&#xff08;只适合第一次&#xff09; 3.2 差异备份&#xff08;用的较少&#xff0c;有丢失数据的现象…

应用 Serverless 化,让业务开发心无旁骛

我们希望让用户做得更少而收获更多&#xff0c;通过Serverless化&#xff0c;用云就像用电一样简单。”张建锋表示&#xff0c;Serverless 让云计算从一种资源真正变成一种能力&#xff0c;未来云将全面 Serverless 化&#xff0c;更加接近“电网”模式&#xff0c;按计算的调用…

使用Visual Studio Code 进行Python编程

1、下载Visual Studio Code 到微软的Visual Studio Code官方主页下载Visual Studio Code: Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器Visual Studio 开发工具和服务让任何开发人员在任何平台和语言的应用开发都更加轻松。 随时随地免费使用代码编辑器或 I…

web期末网站设计大作业:基于HTML+CSS+JavaScript制作新能源汽车企业网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

负载均衡四层和七层的区别

一. 什么是负载均衡 1&#xff09;负载均衡&#xff08;Load Balance&#xff09;建立在现有网络结构之上&#xff0c;它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡有两方面的含义&#…

基于Boost库的在线搜索引擎

文章目录Boost库搜索引擎1. 项目背景2. 宏观原理3. 搜索引擎技术栈和项目环境4.正排索引vs倒排索引&#xff08;index.hpp&#xff09;1. 正排索引:数组vector<>2. 目标文档进行分词(方便倒排索引和查找)3. 倒排索引&#xff1a;unordered_map<>模拟一次查找的过程…

反向传播不香了?解读 Hinton 大佬的 Forward-Forward 算法

今天解读一篇Hinton大佬最近分享的论文。 在最近的NeurIPS2022会议上&#xff0c;图灵奖得主Hinton作为演讲嘉宾&#xff0c;分享了一个题为《The Forward-Forward Algoritm: Some Preliminary Investigations》的论文。 该论文提出了一种取代反向传播的前向-前向传播的训练方…

华为机试 - 比较两个版本号的大小

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 输入两个版本号 version1 和 version2&#xff0c;每个版本号由多个子版本号组成。 子版本号之间由 “.” 隔开&#xff0c;由大小写字母、数字组成&#xff0c;并且至少有一个字符。 按从左到右的顺…

spirng boot 打包,胖fat包和瘦thin包

一、打胖包fat 打胖包采用的是spring的标准来执行&#xff0c;所以使用的是spring boot提供的打包插件 参考来源&#xff1a;打包Spring Boot应用 - 廖雪峰的官方网站 步骤 pom配置 <project ...>...<build><plugins><plugin><groupId>org.s…

Python 奇淫技巧,助你更好的摸鱼

作为一个数据分析者&#xff0c;日常工作几乎离不 python。一路走来&#xff0c;积累了不少有用的技巧和 tips&#xff0c;现在就将这些技巧分享给大家。这些技巧将根据其首字母按 A-Z 的顺序进行展示。 ALL OR ANY Python 之所以成为这么一门受欢迎的语言一个原因是它的可读…

(一)整合管理范围管理

爬虫组件分析目录概述需求&#xff1a;设计思路实现思路分析1.指定项目章程2.项目管理计划3.指导4。管理项目知识4.5.监控项目工作4.6 实施整体变更控制4.7 项目收尾合同5。范围管理收集需求定义范围创建WBS确认范围&#xff1b;控制范围Survive by day and develop by night. …