1. 程式人生 > >Matlab如何在圖上畫包圍目標區域的矩形(或圓)

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函式獲取連通區域個數。