HOMEソリューションImage-Proの画像解析の例
ソリューション 粒子の分散度を区画法で測定する

Q: 画像を小さい領域に分割して粒子の分散度を調べたい。

A: 粒子の分散度は、ボ ロノイ多角形を使用した方法の他に、区画法でも解析できます。
区画法では、画像を碁盤目状の区画に区切り、それぞれの区画内に存在する粒子の合計面積と、区画全体に対して粒子が占める面積比率を測定します。
Image-Pro Plus でこの解析を行なうには、画像内に AOI (Area of Interest: 対象領域) を作成し、それを画像内で移動しながら、各区画 (= AOI の領域) に存在する粒子の面積・面積比率をカウント/サイズで測定していきます。

区画法

測定結果は、1つの区画内で測定が終了する毎に、"Data Collector" (データコレクタ) で収集しておけば、結果の集計やグラフ化が簡単に行なえます (データコレクタのグラフ作成機能は、Image-Pro Plus ver. 6.0 以降に搭載されています) 。

この種の測定は、非常に多くの反復処理が必要なため、手動で行なうのは極めて非効率的です。このため、以下の測定手順は、本ページの末尾に示すマクロを使 用することを前提にしています。

測定手順は以下の通りです。

注記: マクロのインストール方法については、本ページの 末尾の「区画法のサンプルマクロについて」をご覧下さい。
  1. 画像を開き、"Macro" (マクロ) メニューの最下段に表示されるマクロ名 "SectMthd_Setup" をクリックします。
    設定用マクロを起動
これで設定用のマクロが実行され、"Count/Size" (カウント/サイズ) と "Data Collector" (データコレクタ) が起動して、以下の測定項目が自動設定されます。
  • "Object Count" (カウント数)
  • "Total Objects" (オブジェクト合計数)
  • "Area" (面積) の "Sum" (合計)
  • "Per Area (Obj./Total)" (面積比) の "Sum" (合計)
注記:
  • この "Sect_Mthd" マクロは設定を行なうだけですので、セッションで1回実行すれば十分です。測定の度に実行する必要はありません。
  • "Object Count" (カウント数) は選別レンジを適用した後のカウント数です。"Total Objects" (オブジェクト合計数) は選別レンジ適用前のカウント数です。ここでの測定のように、決められた数の区画から測定結果を収集するときは (あるいは決められた枚数の画像から測定結果を 収集するときは)、"Object Count" (カウント数) だけでなく "Total Objects" (オブジェクト合計数) を必ず選択しておく必要があります (選択しないと、区画内または画像内のオブジェクト数が0だったときに、測定結果がデータコレクタへ収集されません)。
  • 測定項目はここではマクロで自動設定されますが、"Area" (面積) と "Per Area (Obj./Total)" (面積比) を手動で選択される場合は、"Layout" (項目選択) タブの "Data Sources/Data Items" (データソース/データ項目) 欄でそれぞれの測定項目を測定する際に、測定項目の下の欄で "Value" (値) でなく "Sum" (合計) を選択して下さい。
  1. "Count/Size" (カウント/サイズ) ダイアログの "Manual" (手動抽出) を選択してから "Select Ranges" (レンジを選択) をクリックし、"Segmentation" (色抽出) ウィンドウを開きます。
    手動抽出

  2. "Segmentation" (色抽出) ウィンドウで画像を2値化します。
    画像を2値化

    画像内の粒子が赤く表示されるように2値化したら、"Close" (閉じる) ボタンをクリックして "Count/Size" (カウント/サイズ) に戻ります。

  3. 必要に応じて、測定する粒子を取捨選択する選別レンジを設定して下さい。選別レンジを設定するには、"Count/Size" (カウント/サイズ) の "Measure" (測定) メニューから "Select Measurements" (測定項目) を実行し、中央の "Filter Objects" (選別レンジ) 欄で測定項目を選択してから、その下の "Start" (最小) 欄と "End" (最大) 欄に数値を入力します (最大~最小のレンジ内にある粒子のみが測定対象となります)。

  4. "Macro" (マクロ) メニューの最下段に表示されるマクロ名 "SectMthd" をクリックして測定用のマクロを起動します。
    測定用マクロを実行

  5. 「区画のサイズ (1辺の長さ) を指定して下さい。」というメッセージが表示されたら、区画 (矩形AOI) のサイズをピクセル単位で指定し、"OK" をクリックします。
    区画のサイズを指定

    これで画像内に矩形AOI が現われ、移動しながら測定を実行します。

    測定実行

  6. 測定が終了したら、"Data Collector" (データコレクタ) の "Data List" (データ一覧) タブや "Statistics" (統計) タブで測定データを見ることができます。データを外部に出力するには、"Export" (出力) タブのオプションを使用して下さい。

    Image-Pro Plus ver. 6.0以降では、データコレクタのグラフ作成オプションを利用できます。次の図は、"Data List" (データ一覧) で表示中の測定結果を、"Data Graph" (データグラフ) ボタンでグラフ化した結果です。
    グラフを表示

● 区画法のサンプルマクロについて

上記の手順による測定を実行するマクロです。
マクロのインストール手順は以下の通りです。
  1. 次のマクロの「'***** マクロここから *****」~「'***** マクロここまで *****」の範囲をクリップボードにコピーして下さい。
  2. Image-Pro Plusを起動し、"Macro" (マクロ) メニューの "Edit Macro" (マクロ編集) コマンドを実行し、マクロエディタを開きます。
  3. マクロエディタウィンドウの末尾にカーソルを入れ、[Enter]キーを1回押して改行して下さい。
  4. マクロエディタの "Edit" (編集) メニューにある "Paste" (貼り付け) を実行し、1.の手順でコピーしたマクロをマクロエディタ内に貼り付けます。
  5. マクロエディタの "File" (ファイル) メニューにある "Save" (上書き保存) コマンドを実行して、マクロを保存します。
  6. Image-Pro Plus 本体の "Macro" (マクロ) メニューの最下段に、マクロ名 ("SectMthd_Setup" と "SectMthd") が表示されていることを確認します。もし表示されない場合は、 "Macro" (マクロ) メニューの "Macro" (マクロ) コマンドを実行し、"Reload" (再ロード) ボタンをクリックしてみて下さい。
'***** マクロ ここから *****
Sub SectMthd_Setup()
'カウント/サイズを開き、設定を行ないます:
    ret = IpBlbShow(1)
    ret = IpBlbSetAttr(BLOB_ADDCOUNT, 1)
    ret = IpBlbSetAttr(BLOB_MEASUREOBJECTS, 1)
    ret = IpBlbSetAttr(BLOB_FILTEROBJECTS, 1)
    ret = IpBlbSetAttr(BLOB_CLEANBORDER,0)
    ret = IpBlbSetAttr(BLOB_FILLHOLES,0)

'データコレクタを開きます:
    ret = IpDcShow(3)

'データコレクタの収集項目を選択します:

    'カウント数を選択:
    ret = IpDcSelect("Count_Size", "Count", 0)

    'オブジェクト合計数を選択:
    ret = IpDcSelect("Count_Size", "Total_Count", 0)

    '面積(合計値)を選択:
    ret = IpDcSelect("Count_Size", "BLBM_AREA", 6)

    '面積比(合計値)を選択:
    ret = IpDcSelect("Count_Size", "BLBM_PERAREA", 6)

End Sub


Sub SectMthd()

'変数宣言部:

    '横・縦方向測定のループ用カウンタ:
    Dim xloop As Integer
    Dim yloop As Integer

    '画像情報:
    Dim dInfo As IPDOCINFO

    '横・縦方向の測定回数:
    Dim Kaisuu_X As Integer
    Dim Kaisuu_Y As Integer

    '矩形AOIのサイズ:
    Dim AOI_Size As Integer

'画像の縦横サイズ(dInfo.height、dInfo.width)を取得します:
ret = IpDocGet(GETDOCINFO, DOCSEL_ACTIVE, dInfo)

'画像がない場合はマクロを終了します:
If ret < 0 Then
    Exit Sub
End If

'矩形AOIの一辺のサイズ(AOI_Size)を指定します(初期値:50、最小:10、最大:1000):
Saisettei:
ret = IpStGetInt("区画のサイズ (1辺の長さ) を指定して下さい。", AOI_Size, 50, 10, 1000)

'区画サイズ指定時にユーザが「取り消し」ボタンをクリックしたらマクロを終了します:
If ret = 0 Then
    Exit Sub
End If

'指定された区画サイズが適切(画像サイズの1/2以内)かどうかを判断します:
If dInfo.Width < (AOI_Size * 2) Or dInfo.Height < (AOI_Size * 2) Then
    MsgBox("指定した区画のサイズが大きすぎます。再設定して下さい。")
    GoTo Saisettei
End If

'横方向の測定回数(Kaisuu_X)と縦方向の測定回数(Kaisuu_Y)を算出します:
Kaisuu_X = dInfo.Width \ AOI_Size
Kaisuu_Y = dInfo.Height \ AOI_Size

'指定された区画サイズ(AOI_Size)に基づいて、画像内に矩形AOIを作成します:
'    ret = IpAoiExShow()
    ipRect.Left = 0
    ipRect.top = 0
    ipRect.Right = AOI_Size - 1
    ipRect.bottom = AOI_Size - 1
    ret = IpAoiCreateBox(ipRect)

'データコレクタの自動収集オプションをOFFに設定します:
    ret = IpDcSet(DC_AUTO, 0)

'以下、縦横方向の測定回数(Kaisuu_Y、Kaisuu_X)に達するまでループ処理します:
   yloop = 1
   xloop = 1

    For yloop = 1 To Kaisuu_Y

      For xloop = 1 To Kaisuu_X
        'カウントを実行します:
        ret = IpBlbCount()
        ret = IpBlbUpdate(0)
        ret = IpBlbUpdate(4)

        'カウント結果をデータコレクタへ送ります:
        ret = IpDcUpdate(DC_FETCH)
        ret = IpMacroWait(2)
        ret = IpAoiMove(AOI_Size, 0)
      Next xloop

       'AOIを左端へ戻し、一段下へ移動します:
      ret = IpAoiMove(-1 * (AOI_Size * Kaisuu_X) , AOI_Size)

    Next yloop

    'AOIを非表示にします:
    ret = IpAoiShow(FRAME_NONE)

End Sub
'***** マクロ ここまで *****