图形学中的不变矩方法及其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