- 締切済み
VBAでの画像の二値化について
画像の二値化についての質問です 植被率についてのプログラムを作りたいと思っています そこで画像の解析ソフトを作成したいと思っているのですが、画像の色の閾値を指定して(緑を抽出して)白黒の二値化をするにはどのようにプログラミングをすればよろしいのでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- a_green_wind
- ベストアンサー率75% (3/4)
質問の趣旨が「RGBデータから緑らしさへの変換方法」なのか「RGBデータの抽出方法」なのか不明です。 参考のため24ビットBMPファイルを読み込み2値化してファイルに保存するサンプルを書いておきます。 サンプルピクチャのアジサイ.jpg(1024 x 768)を24ビットBMPファイルに変換してテストしたところ、処理時間は1.2秒でした。 緑の抽出方法ですが、RGBデータからGの値を閾値で判定する方法では、明るい色がすべて対象になってしまいます。 下記のサンプルプログラムではGの比率で判定していますが、どうでしょうか。 植被率を調べたいのであれば、実際のデータのRGB3次元空間での分布状態を多変量解析して分離超平面(超曲面)を求めて判定することになると思います。 Private Type BITMAPFILEHEADER bfType As String * 2 bfSize As Long bfReserved1 As Integer bfReserved2 As Integer bfOffBits As Long End Type Private Type BITMAPINFOHEADER biSize As Long biWidth As Long biHeight As Long biPlanes As Integer biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Long biYPelsPerMeter As Long biClrUsed As Long biClrImportant As Long End Type Private Sub test1() Const 閾値 = 0.5 Dim ビットマップファイル先頭部 As BITMAPFILEHEADER, DIB先頭部 As BITMAPINFOHEADER, 画像データ() As Byte 出力ファイル名 = Environ("tmp") & "\test1.bmp" With Application.FileDialog(msoFileDialogFilePicker) .Title = "画像を選択してください。" .Filters.Clear .Filters.Add "bmpファイル", "*.bmp" .AllowMultiSelect = False If .Show = 0 Then Exit Sub ファイル名 = .SelectedItems(1) End With ファイル番号 = FreeFile() Open ファイル名 For Binary Access Read As ファイル番号 Get ファイル番号, , ビットマップファイル先頭部 Get ファイル番号, , DIB先頭部 If DIB先頭部.biBitCount <> 24 Then Close ファイル番号 Exit Sub End If ReDim 画像データ(DIB先頭部.biSizeImage - 1) Get ファイル番号, , 画像データ Close ファイル番号 For i = 0 To DIB先頭部.biSizeImage - 1 Step 3 青 = 画像データ(i) 緑 = 画像データ(i + 1) 赤 = 画像データ(i + 2) 白黒 = IIf(緑 / (青 + 緑 + 赤 + 1) > 閾値, 255, 0) 画像データ(i) = 白黒 画像データ(i + 1) = 白黒 画像データ(i + 2) = 白黒 Next ファイル番号 = FreeFile() Open 出力ファイル名 For Binary Access Write As ファイル番号 Put ファイル番号, , ビットマップファイル先頭部 Put ファイル番号, , DIB先頭部 Put ファイル番号, , 画像データ Close ファイル番号 End Sub