当前位置: 首页 > ops >正文

图形学中的不变矩方法及其matlab实现

最近小编看见在对图像中的物体进行识别时,在matlab中经常会使用到regionprops函数,具体函数使用方法,查看帮助文档,本文不细说。

那么除了regionprops函数,还有其他什么方法可以对图像中的图形进行提取呢?此时可以使用基于不变矩的方法。关于不变矩方法的讲解,可以参考下贴:

不变矩方法 - 做自己的快乐人 - 博客园 (cnblogs.com)https://www.cnblogs.com/kykuaileren/archive/2011/08/13/2137330.html

1、概述:

矩函数在图像分析中有着广泛的应用,如模式识别、目标分类、目标识别与方位估计、图像编码与重构等。一个从一幅数字图形中计算出来的矩集,通常描述了该图像形状的全局特征,并提供了大量的关于该图像不同类型的几何特性信息,比如大小、位置、方向及形状等。图像矩的这种特性描述能力被广泛的应用在各种图像处理、计算机视觉和机器人技术领域的目标识别与方位估计中。一阶矩与形状有关,二阶矩显示曲线围绕直线平均值的扩展程度,三阶矩则是关于平均值的对称性的测量。由二阶矩和三阶矩可以导出一组共七个不变矩。不变矩是图像的统计特性,满足平移、伸缩、旋转均不变的不变性,在图像识别领域得到了广泛的应用。

2、不变矩的物理含义:

如果把图像看成是一块质量密度不均匀的薄板,其图像的灰度分布函数f(x,y)就是薄板的密度分布函数,则其各阶矩有着不同的含义,如零阶矩表示它的总质量;一阶矩表示它的质心;二阶矩又叫惯性矩,表示图像的大小和方向。事实上,如果仅考虑阶次为2的矩集,则原始图像等同于一个具有确定的大小、方向和离心率,以图像质心为中心且具有恒定辐射率的椭圆。由三阶矩以下矩构成的七个矩不变量具有平移、旋转和尺度不变性等等。当密度分布函数发生改变时,图像的实质没有改变,仍然可以看做一个薄板,只是密度分布有所改变。虽然此时各阶矩的值可能发生变化,但由各阶矩计算出的不变矩仍具有平移、旋转和尺度不变性。通过这个思想,可对图像进行简化处理,保留最能反映目标特性的信息,再用简化后的图像计算不变矩特征,可减少计算量。

3、利弊:

研究表明,只有基于二阶矩的不变矩对二维物体的描述才是真正的与旋转、平移和尺度无关的。较高阶的矩对于成像过程中的误差,微小的变形等因素非常敏感,所以相应的不变矩基本上不能用于有效的物体识别。即使是基于二阶矩的不变矩也只能用来识别外形相差特别大的物理,否则他们的不变矩会因为很相似而不能识别

matlab中不变矩方法的实现:
某些游戏,当用户在触摸屏上输入一个形状(圆、矩形、三角形等)后,应用根据接收到的不同形状来执行不同的操作,但如何判断用户输入的形状类型是此应用的主要问题。
为了解决此问题,下面介绍一种基于标记法的形状识别算法。
对于输入图像,我们需寻找一种表示方法,来区分出所有形状(为了说明这里我们只识别圆、矩形、三角形三种不同的形状,其他形状可对算法进行扩展),无论是何种表示方法,必须对图像的平移、旋转、收缩不敏感。
下面介绍基于标记的形状检测算法:
1、获得形状的轮廓坐标;
2、将轮廓坐标转换为相应的极坐标(theta-rho),这里我们主要关心rho,rho为轮廓上的点到该形状重心的距离;
3、根据rho的特征区分各个形状。
根据第2步得到的theta-rho关系图(如下图所示)可以得知,圆形的最小rho相对较大;矩形有四个明显的峰值;三角形有三个明显的峰值。故可以利用此特性来区分形状。 

主要函数如下所示:

function [ result,theta,rho,peak_num ] = shapeDetector( boundary )
%SHAPEDETECTOR Detect shapes, eg: Circle, Rectangle, Triangle
%   author: heawjc
%   2013.3.10
boundaryx=boundary(:,2);
boundaryy=boundary(:,1);
centroid=[(max(boundaryx)+min(boundaryx))/2 (max(boundaryy)+min(boundaryy))/2];
boundaryx=boundaryx-centroid(1);
boundaryy=boundaryy-centroid(2);% x - y => theta - rho
[theta,rho]=cart2pol(boundaryx,boundaryy);
r=sortrows([theta*180/pi rho]);
[~,idx]=min(r(:,2));
if idx>1r=[r(idx:end,:);r(1:idx-1,1)+360 r(1:idx-1,2)];
end
theta=r(:,1);
rho=r(:,2)/max(rho);% check which shape
if min(rho)>.7result='Circle';peak_num=0;
else% find peak numberspeak_num=length(findpeaks(r(round(linspace(1,length(theta),min([length(theta) 32]))),2)));switch peak_numcase 3result='Triangle';case 4result='Rectangle';otherwiseresult='Unknown Shape';end
end
end

 原文链接:
基于标记的形状检测 – MATLAB中文论坛 (ilovematlab.cn)https://www.ilovematlab.cn/thread-222728-1-1.html

regionprops函数的使用方法:

% Matlab% 仅供参考
close all
clc
rgb=imread('test.png');
hsv=rgb2hsv(rgb);
s=hsv(:,:,2);
bw=im2bw(s,.6);
bw=imfill(bw,'holes');
bw=imclearborder(bw);
bw=bwareaopen(bw,200);% 提取目标物,若提取出原始目标,可使用BoundingBox
% 以上代码均可忽略
stats=regionprops(bw,'BoundingBox');
bb=cat(1,stats.BoundingBox);
count=length(stats);
figure
for i=1:countf=imcrop(rgb,bb(i,:));subplot(1,count,i),imshow(f)
end

 

http://www.xdnf.cn/news/11173.html

相关文章:

  • 推荐一款基于Java的音视频处理开源项目--JAVE
  • 转贴:网友【原创·教程】 SRT外挂字幕时间轴调整及合并中英文同步字幕制作方法
  • C++ QT结合FFmpeg实战开发视频播放器-08播放器项目的整体UI架构
  • 当你在浏览器输入www.xxx.com的时候会发生什么?
  • linux 防火墙firewall详解
  • MSDE2000安装
  • 信息论:熵与互信息
  • 分享一个简洁、优雅且高效的 Hugo 博客主题 - FixIt
  • CSS基础学习--9 边框(Border)
  • Oracle数据库入门教程(作者原创)
  • Linux内核(十)WIFI BT电路解析 对应设备树配置解析
  • Ubuntu安装eclipse
  • 补丁(patch)的制作与应用
  • 什么是原码、反码和补码
  • reviewboard环境搭建(3):创建站点
  • 姓氏的来历
  • 位图是什么
  • PDF 解锁(unlock)
  • Zblog模板:三栏自适应网赚博客主题模板
  • ActivityThread分析—ActivityThread的main方法的执行流程分析
  • Flask——request的form_data_args用法
  • 汇编语言入门教程
  • HttpWatch使用教程
  • 万用表之电压测量原理(基于ICL7107)
  • 多点定位MLAT系统解决方案
  • static 函数和普通函数
  • 归并排序(Merge Sort)
  • C++ assert.h头文件
  • H264解码之TS流解析
  • VRML基础知识