• 締切済み

VBAでの画像の二値化について

画像の二値化についての質問です 植被率についてのプログラムを作りたいと思っています そこで画像の解析ソフトを作成したいと思っているのですが、画像の色の閾値を指定して(緑を抽出して)白黒の二値化をするにはどのようにプログラミングをすればよろしいのでしょうか?

みんなの回答

回答No.1

質問の趣旨が「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

関連するQ&A

  • パターン認識について

    画像中に含まれる信号機(青・黄・赤)を抽出して出力画像に示す、といったプログラムを作成しようとしています。 認識率を高めるにはRGBの閾値を定めて抽出するだけでは不足ですよね? 微分フィルタなどの技法は知っていますがそれをどう使えばいいのかが考えてもわかりません。 どういった技法が有効なのでしょうか?是非回答よろしくお願いします。

  • Canny法に用いる閾値の決定法について

    とあるプログラムをしている者です。 Canny法を用いてエッジ抽出を試みているのですが、 ヒステリシス閾値で用いる高い閾値と低い閾値の適切な決定法がわかりません。 最終的には抽出の対象となる画像ごとに適切な閾値を設定し 処理をかけたいと考えています。 しかし、対象とする画像の背景と抽出したいオブジェクトの色の濃度が 画像によって大きく変化するため、従来の決定法では対応しきれていない現状です。 そこで、Canny法に用いる適切な閾値の決定法がありましたら ぜひご教授頂きたいと思います よろしくお願いします

  • c++のプログラミングにて

    青い背景にボールが映っている画像があります HSB値に対する閾値処理を行いボールだけを抽出したいのですが プログラミング素人の自分には全くわかりません サンプルプログラムやヒントなどをどうかお願いします

  • RDS…白黒のノイズ画像が作りたい

    プログラミング初心者です。 心理学の実験のために、RDS…Rondom Dot Stereogramを作成したいと思っています。 白黒のドットがランダムに発生していて、画面をびっしりおおっている画像です。 いろいろなページでフリーソフトが提供されていましたが、たとえば、それぞれのドットの色の濃さを決定している計算?や全体における割合?分布?のような理論(というかプログラミング??)がわからず、 実験に使うには謎が多すぎるかな と感じています。 そこで、自分でノイズ画像を作りたいのですが、それはどのようなソフトを使えばいいのでしょうか??そして、自分でプログラミングする場合、記述内容を初心者が自力でやるのは難しいでしょうか?? (漠然とした質問ですみません…) Mathematicaというものの3次元関数を参考にした という記述は見たのですが、それ以外にも、作成する方法がありましたら教えてください。 (ちなみに、Photo shopでは作成済みです)

  • 白黒の二値画像

    今、java言語で、JPEG形式の画像を白黒の二値画像に変換させるプログラムを考えているのですが、ピクセルの色の取得法がよく分からず、変換できません。 どのようにしたら、白黒の二値画像になるのか、簡単なプログラムを教えてもらえませんか?

    • ベストアンサー
    • Java
  • Image Jを使った蛍光粒子の面積を測定する方

    Image Jを使って蛍光粒子の面積を測定する方法について質問です。 本日Image Jを使い始めた初心者です。 現在、以下の画像にあるような蛍光粒子の画像解析をしているのですが、それぞれの粒子の蛍光強度が異なるため、面積が正確に測定できません。 例えば、(1)の粒子は(2)に比べて大きいため蛍光強度にかなり差があります。 (1)の面積を測定しようと閾値を設定すると、(2)の輝度が設定した閾値以下になるため測定できず、反対に(2)に合わせて閾値を低めに設定すると、(1)の散乱している緑色光も拾ってしまうため、面積が過大評価されてしまいます。 ちなみに閾値は、画像を8bitに変換後、Thresholdでアルゴリズムを”Minimum”に設定することで決定しています。 そこで、それぞれの粒子を選択して(Rectangleで該当箇所を選択し)同様の手順で閾値を設定しようと思ったのですが、それはできないみたいで(同一画像内ではひとつの閾値しか設定できない?)、それぞれの粒子をトリミングして別々の画像にすることで測定しようと思いました。 ただ、トリミングした画像をImage Sequenceでまとめて解析しようとすると、一枚の画像として認識されるみたいで、また同じような問題が発生してしまいます。 以上の理由で、現在トリミングした画像を1枚1枚処理しなければならない状況です。 このような画像が何百枚もあるので、1枚の画像につき1粒の粒子を解析しようとすると大変非効率です。 もっと良い方法はないでしょうか? どなたか親切な方、お願いいたします。

  • C言語での簡単な画像処理みたいなのですが

    初心者なんで言葉が適切でないかも知れませんがお許しください。 ”0”、”1”(白黒の対応)でできている何行何列かできている画像を読みこんで、自分が指定したある画像の一部の場所を出力するプログラムを作成したいのですがどうしたらよいのかさっぱりわかりません。 1ビットが白か黒か判断することはできたのですが、だれか教えていただけないでしょうか?御願いします。

  • 画像に対する輪郭線

    色々とネットで調べたのですが思うように行かなくて フォトショップ、ペインター、フォトフィルター、ピクトベアー 輪郭抽出のソフトなど試してみましたが期待通りの結果が出せませんでした 元画像は、金属片の拡大画像で約2500倍に拡大しています 白黒でカラーではないのと、輪郭があまりはっきりしないのともあって 画像を濃淡で表示させ輪郭を抽出しようとしましたが濃淡も薄くて輪郭が抽出されない部分があり困っています 輪郭抽出方法やソフトの情報ありましたらお願いします

  • 画像を読み込んで白黒かカラーかを判別するには?

    読み込んだ画像が白黒かカラーかを判別する方法をご教授下さい。 要件としましては、 ・ファイルのフォーマットとしてはどちらもカラー(24or32Bit) ・黄ばんだ紙をスキャナで取り込んだ画像も白黒、または準白黒(単一色?)としたい 単純に考えたところ、画素(RGB)の最大/最小との差が閾値以内の場合は灰色とし、そうでないものはカラーとしたりと考えました。 ですが、これだと黄ばんだ紙に対応できないように思えます。 環境は以下になります。 ・Windows7,XP ・VisualStudio2005 ・.Net framework 2.0 ・OpenCVSharp(OpenCVの.NETラッパ) 以上です。 よろしくお願い致します。

  • データベースに登録済みの文字を抽出し、文字を画像化するプログラムを作成

    データベースに登録済みの文字を抽出し、文字を画像化するプログラムを作成したいと思っています。 文字情報から画像を作成するプログラムをJavaで作成するにはどうすれば良いのでしょうか? できれば、プログラムで自前で作成したいのですが、ツール等を購入する必要がありましたら 併せて教えて頂きたいです。 画像のサイズ、色、文字フォント等は固定で構いません。 OSはLINUXです。