這里給出在Matlab圖像處理工具箱中非常重要的一個圖像分析函數:regionprops。顧名思義:它的用途是get the properties of region,即用來度量圖像區域屬性的函數。
語法
STATS = regionprops(L,properties)
描述
測量標注矩陣L中每一個標注區域的一系列屬性。L中不同的正整數元素對應不同的區域,例如:L中等於整數1的元素對應區域1;L中等於整數2的元素對應區域2;以此類推。返回值STATS是一個長度為max(L(:))的結構數組,結構數組的相應域定義了每一個區域相應屬性下的度量。properties 可以是由逗號分割的字符串列表、飽含字符串的單元數組、單個字符串 'all' 或者 'basic'。如果 properties 等於字符串 'all',則所有下述字串列表中的度量數據都將被計算,如果 properties 沒有指定或者等於 'basic',則屬性: 'Area', 'Centroid', 和 'BoundingBox' 將被計算。下面的列表就是所有有效的屬性字符串,它們大小寫敏感並且可以縮寫。
屬性字符串列表Area EquivDiameter MajorAxisLength
BoundingBox EulerNumber MinorAxisLength
Centroid Extent Orientation
ConvexArea Extrema PixelIdxList
ConvexHull FilledArea PixelList
ConvexImage FilledImage Solidity
Eccentricity Image
屬性詳細定義
本部分將結合一個具體的例子說明各種字串相關屬性的意義,矩陣取自在蟻蛉模式識別中做過預處理后的斑紋分割圖像,如下圖:
這是一幅二值圖像,在應用regionprops函數之前必須將其標注,可以調用 bwlabel函數和偽彩色處理,標注后的圖像如下圖:
下面基於以上的材料來考察屬性的含義。
'Area'
是標量,計算出在圖像各個區域中像素總個數。注意:這個數值可能與由函數 bwarea 計算的值有輕微的不同。對於這樣一個數值,我們可以使用它除以整個圖像區域的像素個數而得到斑紋比例,可以作為模式識別的候選特征,並且這個特征是仿射不變的。在本例中最后計算出的面積向量是
[3.8952,9.7213,17.663,3.5762,1.3432,1.6958,0.41974,0.41974,21.625,12.324,4.8187,1.5111]/10000.
'BoundingBox'
是1行ndims(L)*2列的向量,即包含相應區域的最小矩形。BoundingBox 形式為 [ul_corner width],這里 ul_corner 以 [x y z ...] 的坐標形式給出邊界盒子的左上角、boxwidth 以 [x_width y_width ...] 形式指出邊界盒子沿着每個維數方向的長度。本例的各部分區域最小矩形如下圖!注意:請在這熟悉一下函數rectangle的使用方法。
'Centroid'
是1行ndims(L)列的向量,給出每個區域的質心(重心)。 注意:Centroid 的第一個元素是重心水平坐標(x坐標)、第二個元素是重心垂直坐標(y坐標)。Centroid 所有其它元素則按照維順序排列。下圖采用以中心為圓心的小圓來演示質心檢測的效果:
圖中各質心坐標(標准化后的)依次為:
(x,y)= 0.10478, 0.76739 0.11883, 0.081545 0.19586, 0.61092 0.30701, 0.30807 0.65712, 0.31613 0.73165, 0.30531 0.74548, 0.35378 0.80624, 0.72802 0.84546, 0.61564 0.90554, 0.079574 0.93477, 0.77871 0.97611, 0.15576
'MajorAxisLength'
是標量,與區域具有相同標准二階中心矩的橢圓的長軸長度(像素意義下)。本屬性只支持二維標注矩陣。
'MinorAxisLength'
是標量,與區域具有相同標准二階中心矩的橢圓的短軸長度(像素意義下)。本屬性只支持二維標注矩陣。
'Eccentricity'
是標量,與區域具有相同標准二階中心矩的橢圓的離心率(可作為特征)。本屬性只支持二維標注矩陣。
'Orientation'
是標量,與區域具有相同標准二階中心矩的橢圓的長軸與x軸的交角(度)。本屬性只支持二維標注矩陣。
本例的各區域橢圓數據為: 長軸:18.767,45.172,43.003,30.687,16.505,15.698,5.8833,5.8833,46.954,38.873,22.929,15.429 短軸:16.211,26.079,32.709,9.8458,6.8019,8.6386,5.8833,5.8833,35.976,31.022,16.98,7.8038 離心率:0.50387,0.81652,0.6492,0.94713,0.91114,0.83497,0,0,0.64262,0.60262,0.67205,0.86266 方向角:-29.219,-32.192,-9.3909,-50.904,-70.333,48.823,0,0,14.035,17.986,3.0319,-34.238
我們可以考察離心率的變化趨勢,得到對於整個區域中的各區域的似圓性如何的大致感覺,比如下圖是12個區域的離心率變化情形:
由上圖可以看出區域整體的似圓性並不好,實際上可以考慮使用離心率向量作為一個模式識別的特征!!
'Image'
二值圖像,與某區域具有相同大小的邏輯矩陣。你可以用這個屬性直接將每個子區域提取出來,然后再作相應的處理!比如本例的第一個斑紋區域提出后是:
'FilledImage'
與上相同,唯一區別是這是個做了填充的邏輯矩陣!
本例中和上面的沒有區別,只有區域有空洞時才有明顯差別。
'FilledArea'
是標量,填充區域圖像中的 on 像素個數。
'ConvexHull'
是p行2列的矩陣,包含某區域的最小凸多邊形。此矩陣的每一行存儲此多邊形一個頂點的xy坐標。此屬性只支持2維標注矩陣。例如:本例中的所有子區域的最小凸多邊形圖形如下圖
'ConvexImage'
二值圖像,用來畫出上述的區域最小凸多邊形。同時此凸包內的像素均打開,圖像尺寸和此區域對應邊界矩形相同。此屬性只支持2維標注矩陣。例如:本例中的第2個子區域的最小凸多邊形圖形為
。注意:此處函數roipoly很有用!
'ConvexArea'
是標量,填充區域凸多邊形圖像中的 on 像素個數。
'EulerNumber'
是標量,幾何拓撲中的一個拓撲不變量--歐拉數,等於圖像中目標個數減去這些目標中空洞的個數。此屬性只支持2維標注矩陣。本例中的歐拉數均為1。
'Extrema'
8行2列矩陣,八方向區域極值點。矩陣每行存儲這些點的xy坐標,向量格式為 [top-left top-right right-top right-bottom bottom-right bottom-left left-bottom left-top]。此屬性只支持2維標注矩陣。
'EquivDiameter'
是標量,等價直徑:與區域具有相同面積的圓的直徑。計算公式為:sqrt(4*Area/pi)。. 此屬性只支持2維標注矩陣。本例標准化后的12區域直徑向量為:
[2.227,3.5182,4.7423,2.1339,1.3077,1.4694,0.73105,0.73105,5.2473,3.9612,2.477,1.3871]/100.
'Solidity'
是標量,同時在區域和其最小凸多邊形中的像素比例。計算公式為:Area/ConvexArea,這也是個仿射特征,實際上反映出區域的固靠性程度。此屬性只支持2維標注矩陣。本例12區域凸元素比例向量為:
[0.97071,0.66171,0.90846,0.86585,0.84211,0.94393,1,1,0.9096,0.75514,0.90823,0.94737].
'Extent'
是標量,同時在區域和其最小邊界矩形中的像素比例。計算公式為:Area除以邊界矩形面積,這也是個仿射特征,實際上反映出區域的擴展范圍程度。此屬性只支持2維標注矩陣。不再給出計算結果!!
'PixelIdxList'
p元向量,存儲區域像素的索引下標。
'PixelList'
p行ndims(L)列矩陣,存儲上述索引對應的像素坐標。
支持類
輸入的標注矩陣L可以有任意的數值類型。
提醒
使用逗號分割列表語法
當你基於regionprops函數的輸出作算法設計時,使用逗號分割列表語法就凸顯出其非常的價值。例如:對於一個存儲標量的屬性,可以利用此語法創建一個包含圖像中不同區域內此屬性值的向量。例如以下兩句是等價的:
stats(1).Area, stats(2).Area, ..., stats(end).Area
stats.Area
因此,可以使用下面的方法創建相應的向量:
regionprops(L,'Area'); allArea = [stats.Area];
allArea 就是一個與結構數組 stats 具備相同長度的向量。
基於特定原則的區域選擇
當你要基於特定准則條件選擇某個區域時,將函數 ismember 和 regionprops 聯合使用是很有用處的。例如:創建一個只包含面積大於80的二值圖像,用以下命令
idx = find([stats.Area] > 80); BW2 = ismember(L,idx);
ismember解釋:
a=[1 2 3 4 5];
b=[3 2 5 6 7 8 77 44 3];
[tf index]=ismember(a,b); %判斷a中的元素有沒有在b中出現
tf =
0 1 1 0 1
index =
0 2 9 0 3
%tf返回一個和a同樣大小的矩陣,a的元素在b中出現,tf上的相應位置元素值為1,沒有出現則為0;index也是返回一個和a同樣大小的矩陣,其相應位置的值為a相應位置的元素在b中出現的最后標號,注意是最后的標號,若某元素在b中出現多次,則記錄的是最后一次出現的標號,若該位置上的a的元素沒有在b中出現,則返回0.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
計算性能考慮
大多數的屬性測量計算時間都非常地少,除了那些非常依賴於圖像L中區域個數和像素個數的屬性。例如:
'ConvexHull' 'ConvexImage' 'ConvexArea' 'FilledImage'
另外建議一次性計算所有屬性值,因為分開計算和一起計算時間相差無幾!
使用二值圖像工作
在調用regionprops之前必須將二值圖像轉變為標注矩陣。兩個函數可以做到:
L = bwlabel(BW); L = double(BW);
注意:雖然這兩個函數從同一二值圖像產生不同的標注矩陣,但是它們是等效的!例如:給出如下的二值矩陣BW,
1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1
bwlabel 創建一個包含兩個分別由整數1和2標注的連續區域標注矩陣
mylabel = bwlabel(BW) mylabel = 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 2 2
double 創建一個包含一個由整數1標注的不連續區域標注矩陣。
mylabel2 = double(BW) mylabel2 = 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1
regionprops 並不負責自動轉換二值圖像數據類型,而是由你自己決定使用何種數據轉換方法來存儲自己想要的數據。
regionprops函數的擴展思路
在regionprops函數的基礎上,你可以使用它提供的基本數據來擴展它的功能,將區域的曲率數據和骨架數據作為它的另外屬性值來開發,從而希望它能用來做更細致的特征提取。