计算机视觉与模式识别实验2-1 角点检测算法(Harris,SUSAN,Moravec)

文章目录

    • 🧡🧡实验流程🧡🧡
      • Harris算法
      • SUSAN算法
      • Moravec算法
    • 🧡🧡全部代码🧡🧡

🧡🧡实验流程🧡🧡

Harris算法

Harris算法实现步骤:
在这里插入图片描述

  • w表示窗函数,在这个算法中,用于对梯度图像的平方进行滤波,以减少图像中的噪声,从而提高角点检测的准确性。
  • R(i,j) 表示图像中像素点 (i,j) 处的角点响应值。这个值描述了在该像素点周围区域的灰度变化情况,从而表征了该像素是否可能是角点。通常情况下, R(i,j) 的值越大,表示该像素点越可能是角点。因此对于每个像素点,非极大值抑制会检查其周围邻域内的角点响应值,当它是该邻域内的最大值时,才将该像素点的角点响应值保留下来。

SUSAN算法

SUSAN角点检测算法实现步骤:
① 定义局部邻域:对于图像中的每个像素,定义一个局部邻域,通常是以该像素为中心的圆形区域。
② 计算灰度差异度:对于局部邻域内的每个像素,计算它与中心像素的灰度差异度。通常使用的是像素间的灰度差的绝对值作为度量。
③ 确定相似像素:根据计算得到的灰度差异度,判断每个像素是否属于同一类别。具体而言,如果像素与中心像素的灰度差异度小于一定阈值,则认为它们属于同一类别;否则,它们属于不同的类别。
④ 统计局部邻域中相似像素的数量:统计局部邻域中与中心像素属于同一类别的像素数量。
⑤ 角点判断:如果局部邻域中相似像素的数量小于一定阈值,则认为该中心像素是一个角点

原始图像
在这里插入图片描述
Harris、SUSAN角点检测效果如下:
在这里插入图片描述在这里插入图片描述
分析:直观上看,SUSAN标记的角点数更多,由于它是基于像素灰度值的局部统计特征来判断角点的,因此在一些局部特征明显的图像部位中效果较好。它们在理论实现方面有一些相似之处(都需要非极大值抑制),不同的是Harris角点检测算法基于图像局部区域的灰度变化来检测角点,通过计算图像的梯度和自相关矩阵的特征值来判断是否存在角点;而SUSAN 角点检测算法基于像素点的灰度值与周围像素的灰度值的差异来检测角点,通过比较像素与其周围邻域的灰度值之间的差异来判断是否为角点。另外从计算效率感受,SUSAN角点检测算法的计算相对较简单和高效。

Moravec算法

实现步骤:
① 计算窗口中心偏移到四个方向上时的灰度平方差,取最小值,作为兴趣值IV。
② 设置阈值T,将兴趣值大于阈值的点作为候选点(IV>T)。
③ 局部区域选取候选点中的极值点作为特征点。 (局部非最大值抑制)
其中,四个方向灰度差的计算举例如下:
在这里插入图片描述
效果如下:
在这里插入图片描述
分析:可以看到,在参数设置合理的情况下,检测效果不比上述两种算法差,并且检测出了上述方法没有测出的角点,如嘴角处、肩膀处等等。另外,由于算法的局限性,在灰度值很相近的情况下,可能产生误检测,比如这里头发处其实较多误检测。

综上所述,从实验直观感受来说,三种算法总结:

  • 精度上:Harris 算法更优。
  • 鲁棒性:SUSAN 对于噪声有较好的鲁棒性。
  • 计算效率和理论理解上:Moravec 实现简单,对精度要求不是特别高,可以选择 Moravec 算法。

🧡🧡全部代码🧡🧡

%%% Harris


clear; clc ;tic;
ori_im = imread('img/test1_Lena.tif');     % 读取图像
if(size(ori_im,3)==3)
    ori_im = rgb2gray(uint8(ori_im));  %转为灰度图像
end
imshow(ori_im);
% ===================计算图像的梯度===================
% fx = [5 0 -5;8 0 -8;5 0 -5];          % 高斯函数一阶微分,x方向(用于改进的Harris角点提取算法)
fx = [-2 -1 0 1 2];                 % x方向梯度算子(用于Harris角点提取算法)
Ix = filter2(fx,ori_im);              % x方向滤波
% fy = [5 8 5;0 0 0;-5 -8 -5];          % 高斯函数一阶微分,y方向(用于改进的Harris角点提取算法)
fy = [-2;-1;0;1;2];                 % y方向梯度算子(用于Harris角点提取算法)
Iy = filter2(fy,ori_im);              % y方向滤波

% ===================计算自相关矩阵===================
Ix2 = Ix.^2;
Iy2 = Iy.^2;
Ixy = Ix.*Iy;
clear Ix;
clear Iy;
h= fspecial('gaussian',[7 7],2);      % 产生7*7的高斯窗函数,sigma=2
Ix2 = filter2(h,Ix2);
Iy2 = filter2(h,Iy2);
Ixy = filter2(h,Ixy);

% ===================计算角点响应值 R===================
height = size(ori_im,1);
width = size(ori_im,2);
result = zeros(height,width);  % 纪录角点位置,角点处值为1
R = zeros(height,width);
for i = 1:height
    for j = 1:width
        M = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; % 自相关矩阵
        R(i,j) = det(M)-0.06*(trace(M))^2;   
    end
end

% ===================进行非极大值抑制===================
cnt = 0;
for i = 2:height-1
    for j = 2:width-1
        % 进行非极大抑制,窗口大小3*3
        if  R(i,j) > R(i-1,j-1) && R(i,j) > R(i-1,j) && R(i,j) > R(i-1,j+1) && R(i,j) > R(i,j-1) && R(i,j) > R(i,j+1) && R(i,j) > R(i+1,j-1) && R(i,j) > R(i+1,j) && R(i,j) > R(i+1,j+1)
            result(i,j) = 1;
            cnt = cnt+1;
        end
    end
end

% ===================对检测到的角点按照角点响应值进行排序,然后取前 ps 个角点(设定阈值)===================
Rsort=zeros(cnt,1);
[posr, posc] = find(result == 1);
for i=1:cnt
    Rsort(i)=R(posr(i),posc(i));
end
[Rsort,ix]=sort(Rsort,1);
Rsort=flipud(Rsort);
ix=flipud(ix);
ps=100;
posr2=zeros(ps,1);
posc2=zeros(ps,1);
for i=1:ps
    posr2(i)=posr(ix(i));
    posc2(i)=posc(ix(i));
end

% ===================显示原始图像,并在图像上标记检测到的角点===================
imshow(ori_im);
hold on;
plot(posc2,posr2,'g+');
title('Harris');
%%% SUSAN


%设置圆周模板半径和滑动窗口的步长
radius=3;Xstep=1;Ystep=1;
template=fspecial('disk',radius);
template(template>0.01)=1;  %模板二值化
template(template<0.01)=0;
 %提取圆周模板的逻辑地址
[tem_x,tem_y]=find(template==1);
tem_x=tem_x-radius-1;
tem_y=tem_y-radius-1;

t=45; %USAN判定阈值
I = imread('img/test1_Lena.tif');
W=size(I,2);H=size(I,1); %图像大小
nucleas_X=radius+1:Xstep:W-radius; %模板圆心即nucleas运动范围
nucleas_Y=radius+1:Ystep:H-radius;
USAN=zeros(size(I,1),size(I,2));  %初始化USAN累加器
%网格遍历
tic;
for y=nucleas_Y
    for x=nucleas_X
       for e=1:length(tem_x)  %圆周模板上进行判定
           delta=I(y+tem_y(e),x+tem_x(e))-I(y,x);
           if delta<t
               USAN(y,x)=USAN(y,x)+1;  %低于阈值则收纳
           end
       end  
        fprintf(strcat('已处理第','(',num2str(y),',',num2str(x),')','像素点..\n'));
    end
end
toc;
%边缘检测
%
%formula: R(r0) =   g-USAN(r0)  , if USAN(r0)<g
%                    0           ,  otherwise   
%          where g=3/4*max(USAN(:)), USAN越小边缘响应越强,其中角点极小,对应R极大
g=1/2*max(USAN(:));
R=zeros(H,W);
for i=1:size(USAN,1)
    for j=1:size(USAN,2)
        if USAN(i,j)<g
            R(i,j)=g-USAN(i,j);
        else
            R(i,j)=0;
        end
    end
end
BIN=zeros(H,W);
BIN(R>0)=1;
figure(1),imshow(BIN,[]),title('SUSAN  边缘检测');

%角点检测(非极大值抑制)
corners=[];
for i=2:H-1
   for j=2:W-1 
        if R(i,j)>max([max(R(i-1,j-1:j+1)),R(i,j-1) ,R(i,j+1), max(R(i+1,j-1:j+1))])
            corners=[corners;[i,j]];
        end
   end
end
% I = insertMarker(I,corners);
figure(2);imshow(I);hold on;
set(gca,'xaxislocation','top','yaxislocation','left','ydir','reverse');
scatter(corners(:,2),corners(:,1),'x','g'),title('SUSAN');
hold off;
%%% Moravec

close all;
clear all;
clc;
img=(imread('img/test1_LenaRGB.tif'));
img = double(rgb2gray(img));
[X,Y]=size(img);
img2 = imread ('img/test1_LenaRGB.tif');
img2 = rgb2gray(img2);

imgn=zeros(X,Y);
n=2;%控制窗口大小。窗口大小为 2*n+1

% ====计算四个方向的灰度变化平方====
for x=1+n:X-n
   for y=1+n:Y-n
       window=img(x-n:x+n,y-n:y+n);%窗口为5*5
       V=zeros(1,4);
       for i=2:2*n+1        %垂直,水平,对角,反对角四个方向领域灰度差的平方和
            V(1)=V(1)+(window(i,n+1)-window(i-1,n+1))^2;%垂直
            V(2)=V(2)+(window(n+1,i)-window(n+1,i-1))^2;%水平
            V(3)=V(3)+(window(i,i)-window(i-1,i-1))^2;%正对角线
            V(4)=V(4)+(window(i,(2*n+1)-(i-1))-window(i-1,(2*n+1)-(i-2)))^2;%反对角线
       end

       IV=min(V);          %四个方向中选最小值
       imgn(x,y)=IV;      
   end
end

% =====设定阈值T,>=T为兴趣点(潜在角点)====
T=2000; % 阈值
ind=find(imgn<T);
imgn(ind)=0;

imshow(img2);hold on;title('Moravec算子提取');
m=3;
count = 0;
% ====非极大值抑制====
for x=1+m:X-m           %选局部最大(窗口为11*11)且非零值作为特征点
    for y=1+m:Y-m
        window2=imgn(x-m:x+m,y-m:y+m);
        if max(window2(:))==imgn(x,y) && imgn(x,y)~=0
            plot(y,x,'+','color','g');
            count=count+1; 
        end
    end
end

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据容器的通用操作、字符串大小比较 总结完毕!

1.数据容器的通用操作 1&#xff09;五类数据容器是否都支持while循环/for循环 五类数据容器都支持for循环遍历 列表、元组、字符串都支持while循环&#xff0c;集合、字典不支持&#xff08;无法下标索引&#xff09; 尽管遍历的形式不同&#xff0c;但都支持遍历操作 2&a…

在电脑端实现多个微信同时登录[使用bat脚本登录]

在电脑端实现多个微信同时登录[使用bat脚本登录] 我认为工作和生活应该分开进行&#xff0c;但往往不尽人意。 第一步&#xff0c;找到微信启动程序地址。 第二步 创建txt文本&#xff0c;写入start 你的微信启动程序地址。 start D:\微信文件\WeChat\WeChat.exe start D:\微…

The First项目报告:一场由社区驱动的去中心化加密冒险—Turbo

2023年3月14日&#xff0c;由OpenAI公司开发自回归语言模型GPT-4发布上线&#xff0c;一时之间引发AI智能领域的轩然大波&#xff0c;同时受到影响的还有加密行业&#xff0c;一众AI代币纷纷出现大幅度拉升。与此同时&#xff0c;一款名为Turbo的Meme代币出现在市场中&#xff…

在美育浸润中成长 ——中山市光后中心小学张峻皓书画作品毕业汇报展成功举办

5 月 30 号下午 3 点&#xff0c;“在美育浸润中成长——广东省中山市光后中心小学张峻皓书画作品毕业汇报展”在中山市三乡镇光后中心小学成功举行&#xff0c;本次共展出张峻皓同学近期创作书法、国画及陶瓷作品共计78幅。 广东省中山市文联兼职副主席、中山市书法家协会主席…

【距离四六级只剩一个星期!】刘晓艳四级保命班课程笔记(1)(可分享治资料~)

大家好&#xff01;距离四级考试也就只剩下一个星期左右了&#x1f635;‍&#x1f4ab;。我也是时候好好补一补四级了&#xff0c;总不能还是不过吧&#x1f62d;&#xff08;已经考了两次了&#xff09;&#xff0c;这次我一定过过过过过过&#xff0c;大家也一定要过&#x…

若依前后端分离Spring Security新增手机号登录

备忘贴 转自&#xff1a;【若依RuoYi短信验证码登录】汇总_数据库_z_xiao_qiang-RuoYi 若依 配置Security: 按照Security的流程图可知&#xff0c;实现多种方式登录&#xff0c;只需要重写三个主要的组件&#xff0c;第一个用户认证处理过滤器&#xff0c;第二个用户认证tok…

Linux Shell脚本编写指南

大家好&#xff0c;在当今快节奏的科技时代&#xff0c;自动化和高效的工作流程对于个人和组织来说变得愈发重要。而Shell脚本编写作为一种强大且广泛应用的技能&#xff0c;成为了实现自动化任务和系统管理的利器。通过编写Shell脚本&#xff0c;我们可以将繁琐的重复任务自动…

【Matplotlib作图-4.Distribution】50 Matplotlib Visualizations, Python实现,源码可复现

目录 04 Distribution 4.0 Prerequisite 4.1 连续变量的直方图(Histogram for Continuous Variable) 4.2 分类变量的直方图(Histogram for Categorical Variable) 4.3 Density Plot 4.4 Density Curves with Histogram 4.5 Joy Plot 4.6 Distributed Dot Plot 4.7 Box P…

前端 video 实现全屏播放

只需要加上这句代码就行 controls <videoid"myVideo":src"detailDate.linkAddress":poster"detailDate.pictureUrl"enable-danmucontrolswebkit-playsinline"true"></video>

绘画参数配置及使用

绘画参数配置及使用 路径&#xff1a;站点后台-功能-AI绘画 进入参数配置 接口选择&#xff1a;多种接口自主选择&#xff08;需自己准备key&#xff09;&#xff0c;对应接口的key对话和绘画通用 存储空间&#xff1a; 位置在超管后台-存储空间 自主选择存储&#xff08;需…

【STL源码剖析】deque 的使用

别院深深夏席清&#xff0c;石榴开遍透帘明。 树阴满地日当午&#xff0c;梦觉流莺时一声。 目录 deque 的结构 deque 的迭代器剖析 deque 的使用 ​编辑 deque 的初始化 deque 的容量操作 deque 的访问操作 在 pos 位置插入另一个向量的 [forst&#xff0c;last] 间的数据​编…

JVMの堆、栈内存存储

1、JVM栈的数据存储 通过前面的学习&#xff0c;我们知道&#xff0c;将源代码编译成字节码文件后&#xff0c;JVM会对其中的字节码指令解释执行&#xff0c;在解释执行的过程中&#xff0c;又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…

web安全基础学习笔记

这里写目录标题 1.使用hackbar2.php漏洞基本分析 弱类型语言2.2 php漏洞找到隐藏的源代码之 index.php~2.3 php漏洞找到隐藏的源代码之 vim的临时文件 /.index.php.swp3.php漏洞基本分析 数组 3.php漏洞基本分析 extract4.php漏洞基本分析 strpos eregi函数漏洞4.php漏洞基本分…

Java web应用性能分析之【java进程问题分析定位】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 Java web应用性能分析之【jvisualvm远程连接云服务器】-CSDN博客 由于篇幅限制、前面三篇讲了准备工作和分析小结&#xff0c;这里将详细操作java进程问题…

The First项目报告:去中心化知识产权治理协议MON Protocol如何革新链游产业?

2023年12月&#xff0c;RPG NFT 游戏 Pixelmon 首席执行官 GiulioX 在 X 平台表示&#xff0c;确认将推出代币 MON&#xff0c;代币生成&#xff08;TGE&#xff09;时间将取决于 MON 的路线图和主流 CEX 的启动板队列。12 月 11 日&#xff0c;RPG NFT 游戏 Pixelmon 首席执行…

防爆AGV叉车在现代物流行业的应用

AGV 随着机器人技术在中国的快速发展&#xff0c;国内企业开始推出区别于传统叉车的叉车AGV&#xff0c;旨在为企业降本增效&#xff0c;降低人工成本与对人的依赖&#xff1b;同时&#xff0c;也将人工从危险恶劣的环境中解放出来。随着技术的持续提升&#xff0c;叉车AGV已经…

API低代码平台介绍4-数据库记录插入功能

数据库记录插入功能 本篇文章我们将介绍如何使用ADI平台定义一个向目标数据库插入记录的接口&#xff0c;包括手工组装报文单表插入、手工组装报文多表插入、自动组装报文多表插入三种方式。无论是单表插入还是多表插入&#xff0c;任何一条记录写入失败&#xff0c;那么默认情…

kvm学习 - 迅速上手示例

目录 kvmtool kvmsample kvmtool GitHub - kvmtool/kvmtool: Stand-alone Native Linux KVM Tool repoStand-alone Native Linux KVM Tool repo. Contribute to kvmtool/kvmtool development by creating an account on GitHub.https://github.com/kvmtool/kvmtool.git cd …

17.Redis之主从复制

1.主从复制是怎么回事&#xff1f; 分布式系统, 涉及到一个非常关键的问题: 单点问题 单点问题&#xff1a;如果某个服务器程序, 只有一个节点(只搞一个物理服务器, 来部署这个服务器程序) 1.可用性问题,如果这个机器挂了,意味着服务就中断了~ 2.性能/支持的并发量也是比较有限…

C语言学习:数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址&#xff08;类似门牌号&#xff09; • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …