Matlab如何在图上画包围目标区域的矩形(或圆)


1.rectangle函数功能:创建二维矩形对象。

rectangle函数可以用来画矩形、椭圆、圆,画椭圆和圆时需要设置曲率。

rectangle('Position',[x,y,w,h])

从点(x,y)开始绘制一个宽w高h的矩形,对坐标轴数据单元指定值。

rectangle(...,'Curvature',[x,y])指定矩阵边的曲率,可以使它从矩形到椭圆不同变化,水平曲率x为矩形宽度的分数,是沿着矩形的顶部和底部的边进行弯曲。竖直曲率y为矩形高度的分数,是沿着矩形的左面和右面的边进行弯曲。x和y取值范围是从0(无曲率)到1(最大曲率)。值[0,0]绘制一个成直角的矩形,值[x,y]绘制一个椭圆。如果仅仅指定曲率的一个值,那么在水平曲率和竖直曲率都有相同的值。

例:

 rectangle('position',[1,1,5,5],'curvature',[1,1],'edgecolor','r','facecolor','g');

'position',[1,1,5,5]表示从(1,1)点开始高为5,宽为5;

'curvature',[1,1]表示x,y方向上的曲率都为1,即是圆弧;

'edgecolor','r'表示边框颜色是红色;

'facecolor','g'表示面内填充颜色为绿色。

2.矩形的坐标长宽获取

画矩形需要知道矩形左上角的坐标以及矩形长宽。

在图像中,我们通常想要画一个包围目标的最小矩形,把目标圈出来,此时,可以用到另一个函数:regionprops。

它的用途是get the properties of region,即用来度量图像区域属性的函数。 语法STATS = regionprops ( L , properties ) 描述测量标注矩阵L中每一个标注区域的一系列属性。

L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推。

返回值STATS是一个长度为max(L(:))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。

 properties  取值:

- 'basic',则属性: 'Area', 'Centroid', 和 'BoundingBox' 将被计算。

- 'Area'是标量,计算所标记区域的像素总个数,也可以认为是标记区域的面积。
- 'Centroid'是区域的重心。

- 'BoundingBox'是包含区域的最小矩形,该区域应在最小矩形内部。

注意:如果只写STATS = regionprops ( L),则相当于’basic‘,则属性: 'Area', 'Centroid', 和 'BoundingBox' 将被计算,之后可以通过STATS.Area、STATS.BoundingBox 、STATS.Centriod获取计算得到的数据。

使用这个函数获取矩形参数时,目标区域必须是连通的,可以通过腐蚀膨胀开运算闭运算等形态学操作,去除一些噪点以及把需要包围的区域连通起来。

画出矩形:

方法一:

例如,一张二值图像,先通过形态学操作把多个目标区域连通(如已经连通则可省略),之后使用bwlable函数给每个区域贴上标签,则可计算出有多少个连通区域:

[Lbw4, numbw4] = bwlabel(bw4);%把每个单词(此时已连通)贴上标签
                            %Lbw4为贴标签之后的矩阵,numbw4为标签(即单词)个数
stats = regionprops(Lbw4);%获取区域的某个属性(面积、最小包围矩形的坐标长宽等)的值
imshow(bw);hold on;
 for i = 1 : numbw4
  tempBound = stats(i).BoundingBox;
  rectangle('position',tempBound,'edgecolor','r');
end
显示图像及矩形框结果:


方法二:也可以通过cat(dim,A,B)函数把所有的矩形坐标长宽数组合成一个n*4的矩阵:

rects = cat(1,  img_reg.BoundingBox);  %每个BoundingBox存放一个矩形,1代表使用数组合成的维数
                                                   %也即第二个矩形放在第一个矩形下面组成矩阵

显示图像及矩形框:

    % show all the largest connected region  
    figure(1),  
    imshow(bw_img);  
    for i = 1:size(rects, 1)  %通过size函数计算连通域个数
        rectangle('position', rects(i, :), 'EdgeColor', 'r');  
    end  


总结:第一种方法通过贴标签的形式获取连通区域个数,第二种则通过合并数组的方式,再通过size函数获取连通区域个数。



  • 17
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值