不均一な照度の補正と前景オブジェクトの解析
この例では解析の前処理手順としてイメージを強調する方法を説明します。この例では、背景の不均一な照度を補正し、イメージをバイナリ イメージに変換して前景オブジェクト (1 つ 1 つの米粒) を識別しやすくします。その後、各米粒の面積を求めるなど、オブジェクトを分析し、イメージ内のすべてのオブジェクトの統計量を計算できます。
イメージの前処理
イメージをワークスペースに読み取ります。
I = imread('rice.png');
imshow(I)
背景の照度は、イメージの下部の部分より、中央部が明るくなっています。イメージを前処理し、背景の照度をさらに均一にします。
最初の手順として、モルフォロジー オープニングを実行してすべての前景 (米粒) を削除します。オープニング演算により、構造化要素を完全に含めることのできない小さいオブジェクトは削除されます。半径が 15 である円板状の構造化要素を定義し、1 つの米粒内に完全に収まるようにします。
se = strel('disk',15)
se = strel is a disk shaped structuring element with properties: Neighborhood: [29x29 logical] Dimensionality: 2
モルフォロジー オープニングを実行するには、imopen
と構造化要素を併用します。
background = imopen(I,se); imshow(background)
元のイメージ I
から背景の近似イメージ background
を減算し、結果のイメージを表示します。元のイメージから調整後の背景のイメージを減算すると、結果のイメージは背景が均一になりますが、解析対象としては少し暗くなります。
I2 = I - background; imshow(I2)
処理後のイメージ I2
のコントラストを増大させるには、関数 imadjust
を使用してデータを低強度と高強度の 1% で飽和させ、強度値を uint8
のダイナミック レンジ全体に拡大します。
I3 = imadjust(I2); imshow(I3)
前の 2 つの手順は、imtophat
を使用する 1 つの手順に置き換えできることに注意してください。この関数は、最初にモルフォロジー オープニングを計算してから元のイメージから抽出します。
I2 = imtophat(I,strel('disk',15));
処理後のイメージのバイナリ バージョンを作成して、解析にツールボックス関数を使用できるようにします。関数 imbinarize
を使用し、グレースケール イメージをバイナリ イメージに変換します。関数 bwareaopen
を使用して、イメージから背景ノイズを除去します。
bw = imbinarize(I3); bw = bwareaopen(bw,50); imshow(bw)
イメージ内のオブジェクトの識別
元のイメージのバイナリ バージョンが作成されました。このバージョンで、イメージ内のオブジェクトを解析することができます。
バイナリ イメージ内のすべての連結要素 (オブジェクト) を検出します。結果の精度は、オブジェクトのサイズ、連結性パラメーター (4、8 または任意の数)、およびオブジェクトが接しているかどうか (接している場合、1 つのオブジェクトとしてラベル付けされる場合があります) によって異なります。バイナリ イメージ bw
内の米粒のいくつかは接触しています。
cc = bwconncomp(bw,4)
cc = struct with fields:
Connectivity: 4
ImageSize: [256 256]
NumObjects: 95
PixelIdxList: {1x95 cell}
cc.NumObjects
ans = 95
イメージ内にラベル 50 の米粒を表示します。
grain = false(size(bw)); grain(cc.PixelIdxList{50}) = true; imshow(grain)
ラベル行列を作成して、疑似色のインデックス付きイメージとして表示することで、イメージ内のすべての連結要素を可視化します。
関数 labelmatrix
を使用して、関数 bwconncomp
の出力からラベル行列を作成します。関数 labelmatrix
は、オブジェクト数に必要な最小の数値クラスでラベル行列を格納することに注意してください。
labeled = labelmatrix(cc);
whos labeled
Name Size Bytes Class Attributes labeled 256x256 65536 uint8
関数 label2rgb
を使用して、カラーマップ、背景色、ラベル行列の中のオブジェクトがカラーマップの中の色にどのようにマップされるかを指定します。疑似カラー イメージでは、ラベル行列の各オブジェクトを識別するラベルがそれぞれ関連カラーマップ行列内の異なる色にマップされます。
RGB_label = label2rgb(labeled,'spring','c','shuffle'); imshow(RGB_label)
面積ベースの統計量の計算
関数 regionprops
を使用してイメージ内の各オブジェクトの面積を計算します。各米粒は構造体 cc
内では 1 つの連結要素です。
graindata = regionprops(cc,'basic')
graindata=95×1 struct array with fields:
Area
Centroid
BoundingBox
新しいベクトル grain_areas
を作成します。これは各粒の測定面積を保持します。
grain_areas = [graindata.Area];
50 番目の要素の面積を求めます。
grain_areas(50)
ans = 194
最小面積の粒を特定して表示します。
[min_area, idx] = min(grain_areas)
min_area = 61
idx = 16
grain = false(size(bw)); grain(cc.PixelIdxList{idx}) = true; imshow(grain)
histogram
コマンドを使用して米粒の面積のヒストグラムを作成します。
histogram(grain_areas)
title('Histogram of Rice Grain Area')
参考
imopen
| bwareaopen
| bwconncomp
| regionprops
| imadjust
| imbinarize
| label2rgb
| labelmatrix
| imread
| imshow