メインコンテンツ

不均一な照度の補正と前景オブジェクトの解析

この例では解析の前処理手順としてイメージを強調する方法を説明します。この例では、背景の不均一な照度を補正し、イメージをバイナリ イメージに変換して前景オブジェクト (1 つ 1 つの米粒) を識別しやすくします。その後、各米粒の面積を求めるなど、オブジェクトを分析し、イメージ内のすべてのオブジェクトの統計量を計算できます。

イメージの前処理

イメージをワークスペースに読み取ります。

I = imread('rice.png');
imshow(I)

Figure contains an axes object. The hidden axes object contains an object of type image.

背景の照度は、イメージの下部の部分より、中央部が明るくなっています。イメージを前処理し、背景の照度をさらに均一にします。

最初の手順として、モルフォロジー オープニングを実行してすべての前景 (米粒) を削除します。オープニング演算により、構造化要素を完全に含めることのできない小さいオブジェクトは削除されます。半径が 15 である円板状の構造化要素を定義し、1 つの米粒内に完全に収まるようにします。

se = strel('disk',15)
se = 
strel is a disk shaped structuring element with properties:

      Neighborhood: [29×29 logical]
    Dimensionality: 2

モルフォロジー オープニングを実行するには、imopen と構造化要素を併用します。

background = imopen(I,se);
imshow(background)

Figure contains an axes object. The hidden axes object contains an object of type image.

元のイメージ I から背景の近似イメージ background を減算し、結果のイメージを表示します。元のイメージから調整後の背景のイメージを減算すると、結果のイメージは背景が均一になりますが、解析対象としては少し暗くなります。

I2 = I - background;
imshow(I2)

Figure contains an axes object. The hidden axes object contains an object of type image.

処理後のイメージ I2 のコントラストを増大させるには、関数 imadjust を使用してデータを低強度と高強度の 1% で飽和させ、強度値を uint8 のダイナミック レンジ全体に拡大します。

I3 = imadjust(I2);
imshow(I3)

Figure contains an axes object. The hidden axes object contains an object of type image.

前の 2 つの手順は、imtophat を使用する 1 つの手順に置き換えできることに注意してください。この関数は、最初にモルフォロジー オープニングを計算してから元のイメージから抽出します。

I2 = imtophat(I,strel('disk',15));

処理後のイメージのバイナリ バージョンを作成して、解析にツールボックス関数を使用できるようにします。関数 imbinarize を使用し、グレースケール イメージをバイナリ イメージに変換します。関数 bwareaopen を使用して、イメージから背景ノイズを除去します。

bw = imbinarize(I3);
bw = bwareaopen(bw,50);
imshow(bw)

Figure contains an axes object. The hidden axes object contains an object of type image.

イメージ内のオブジェクトの識別

元のイメージのバイナリ バージョンが作成されました。このバージョンで、イメージ内のオブジェクトを解析することができます。

バイナリ イメージ内のすべての連結要素 (オブジェクト) を検出します。結果の精度は、オブジェクトのサイズ、連結性パラメーター (4、8 または任意の数)、およびオブジェクトが接しているかどうか (接している場合、1 つのオブジェクトとしてラベル付けされる場合があります) によって異なります。バイナリ イメージ bw 内の米粒のいくつかは接触しています。

cc = bwconncomp(bw,4)
cc = struct with fields:
    Connectivity: 4
       ImageSize: [256 256]
      NumObjects: 95
    PixelIdxList: {1×95 cell}

cc.NumObjects
ans = 
95

イメージ内にラベル 50 の米粒を表示します。

grain = false(size(bw));
grain(cc.PixelIdxList{50}) = true;
imshow(grain)

Figure contains an axes object. The hidden axes object contains an object of type image.

ラベル行列を作成して、疑似色のインデックス付きイメージとして表示することで、イメージ内のすべての連結要素を可視化します。

関数 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)

Figure contains an axes object. The hidden axes object contains an object of type image.

面積ベースの統計量の計算

関数 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)

Figure contains an axes object. The hidden axes object contains an object of type image.

histogram コマンドを使用して米粒の面積のヒストグラムを作成します。

histogram(grain_areas)
title('Histogram of Rice Grain Area')

Figure contains an axes object. The axes object with title Histogram of Rice Grain Area contains an object of type histogram.

参考

| | | | | | | | |