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

本文介绍了图像分析中不变矩方法的概念、物理含义及其在MATLAB中的实现,强调了二阶矩在旋转、平移和尺度不变性中的作用。此外,还提到了基于标记的形状检测算法,通过分析轮廓坐标转换为极坐标后的rho特征来区分圆形、矩形和三角形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近小编看见在对图像中的物体进行识别时,在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>1
    r=[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)>.7
    result='Circle';
    peak_num=0;
else
    % find peak numbers
    peak_num=length(findpeaks(r(round(linspace(1,length(theta),min([length(theta) 32]))),2)));
    switch peak_num
        case 3
            result='Triangle';
        case 4
            result='Rectangle';
        otherwise
            result='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:count
    f=imcrop(rgb,bb(i,:));
    subplot(1,count,i),imshow(f)
end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你可真搞笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值