如何在matlab里画包围目标的矩形或圆形区域?

http://blog.****.net/horseinch/article/details/51645232


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]绘制一个椭圆。如果仅仅指定曲率的一个值,那么在水平曲率和竖直曲率都有相同的值。

例:

[html] view plain copy
  1.  rectangle('position',[1,1,5,5],'curvature',[1,1],'edgecolor','r','facecolor','g');  
  2.   
  3. 'position',[1,1,5,5]表示从(1,1)点开始高为5,宽为5;  
  4.   
  5. 'curvature',[1,1]表示x,y方向上的曲率都为1,即是圆弧;  
  6.   
  7. 'edgecolor','r'表示边框颜色是红色;  
  8.   
  9. '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

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

画出矩形:

方法一:

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

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

如何在matlab里画包围目标的矩形或圆形区域?

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

[html] view plain copy
  1. rects = cat(1,  img_reg.BoundingBox);  %每个BoundingBox存放一个矩形,1代表使用数组合成的维数  
  2.                                                    %也即第二个矩形放在第一个矩形下面组成矩阵  
显示图像及矩形框:

[plain] view plain copy
  1. % show all the largest connected region    
  2. figure(1),    
  3. imshow(bw_img);    
  4. for i = 1:size(rects, 1)  %通过size函数计算连通域个数  
  5.     rectangle('position', rects(i, :), 'EdgeColor', 'r');    
  6. end    


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