VBAで画像のドット位置を探す方法

このQ&Aのポイント
  • エクセルのVBAを使用して、画像上のドット位置を解析する方法について知りたいです。具体的には、(1)画像の取り込み方法、(2)黒色ドットの定義方法、(3)ドットの位置の抽出方法について教えてください。
  • エクセルのVBAを使って画像上のドットの位置を解析する方法について教えてください。画像の取り込み方法、黒色ドットの定義方法、ドットの位置の抽出方法について知りたいです。
  • エクセルのVBAを使って画像上にあるドットの位置を解析する方法について教えてください。画像の取り込み方法、黒色ドットの定義方法、ドットの位置の抽出方法について詳しく教えてください。
回答を見る
  • ベストアンサー

VBAで画像のドット位置を探す。

ビットマップ等の画像上にドットがいくつかあるとします。 このドットの位置を解析したいです。 あくまでこれをエクセルのVBAで実現させたいです。(VBはもっていないため) 私の考える流れは、(1)画像を取り込む。(2)黒色のドットを探す。(3)黒色ドットの位置を取得する。 上記をもとに、具体的に知りたいことを記載します。 (1)画像ファイルをどこにとりこめばよいかを知りたいです。エクセル上?ユーザーフォーム上? (2)ドットを探すにあたり黒色ドットの定義をどのように記述したらよいか知りたいです。 その定義にあう画像領域内のドットを探すことが目的です。 また検索する画像領域の範囲の定義の仕方を知りたいです。 (3)見つかったドットの位置の抽出の仕方を知りたいです。 そもそも、別のアプローチ方法などあればご教授していただきたいです。 ちなみにですが、画像処理についての知識はまったくない素人です。。

質問者が選んだベストアンサー

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

> 内容に関してですが、bData(19) bData(23)は何を意味しているのでしょうか? > ヘッダーの解説には、19と23についての記載がありませんでした。 ヘッダの解説をよく見てみてください。 [18]からの4byte(18~21)が画像の幅[ピクセル] [22]からの4byte(22~25)が画像の縦[ピクセル] です。 ですから、本当は4byte分でピクセルサイズを求めるべきなのですが、私のコードは予めお断りしている通り手抜き版なので「そんなに大きな画像は読み込まないだろう」とたかをくくって2byte(18と19、22と23)だけ使ってピクセルサイズを求めています。 どの辺りが手抜きなのか説明するべきでしたね。失礼しました。 BMPは1ピクセルごとに情報が取り出せるので簡単ですが、PNGやJPEGは圧縮されているのでそう簡単にはいきません。 私なら他のアプリでBMPに変換してしまいます(^^;

unserious
質問者

お礼

本当にありがとうございます。 まさかできないだろうと思ったことでしたので、ちょっと面白そうです。 しばらく参照しながら頑張ってみます。

その他の回答 (2)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

あぁ、間違えた。7行目、以下の様に直してください If sPath <> Then Exit Sub  ↓ If sPath = "" Then Exit Sub

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

1.ファイルを取り込むというか、BMPファイルをバイナリファイルとして読み込む事になると思います。  読み込んだバイナリを配列に取り込んでも良いですね。  Open パス名 For Binary As ファイル番号 で開きます。 2.8bit以下のBMPならカラーパレットを参照、24bit以上ならRGBが全て0の物を探すことになるかと思います。 3.通常のBMPはデータが左下から右上に向かって記録されていますので、何番目のデータかと言う情報と、ヘッダ情報の解像度と合わせれば位置がわかります。 参考になりそうなサイトのリンクを貼っておきます。 http://www.kk.iij4u.or.jp/~kondo/bmp/ http://www.umekkii.jp/data/computer/file_format/bitmap.cgi 一応、手抜きのサンプルも…。 無圧縮の24bitBMPにしか対応していません。 黒いドットを見つけるごとにA列に縦位置、B列に横位置を記入していきます。 Sub Sample()   Dim bData() As Byte   Dim nFn As Integer   Dim sPath, nW, nH, nCount, nFind, i, j   'BMPファイル選択   sPath = Application.GetOpenFilename(FileFilter:="ビットマップファイル(*.bmp),*.bmp", FilterIndex:=1, Title:="BMP選択", MultiSelect:=False)   If sPath <> "" Then Exit Sub      'BMPを配列に読み込む   nFn = FreeFile   Open sPath For Binary As #nFn     ReDim bData(LOF(nFn))     Get #nFn, , bData   Close #nFn      If bData(28) <> 24 Then     MsgBox ("24bitBMPじゃないので終了")     Exit Sub   End If   nW = bData(18) + 256 * bData(19) '横サイズ   nH = bData(22) + 256 * bData(23) '縦サイズ   nCount = CLng(bData(10)) 'データオフセット   nFind = 1   '4byte調整用   nPlus = 0   If (nW Mod 4) > 0 Then     nPlus = 4 - (nW Mod 4)   End If      For i = 1 To nH     For j = 1 To nW       nWork = CLng(bData(nCount)) + CLng(bData(nCount + 1)) + CLng(bData(nCount + 2))       nCount = nCount + 3       '黒の時の処理       If nWork = 0 Then         Range("A" & nFind) = nH - i + 1         Range("B" & nFind) = j         nFind = nFind + 1       End If       nCount = nCount + nPlus '横ラインは4の倍数byte     Next j   Next i   MsgBox ("確認終了") End Sub

unserious
質問者

補足

大変ありがとうございます。 内容を理解するのに少し時間がかかりましたが、とても具体的で助かります。 内容に関してですが、bData(19) bData(23)は何を意味しているのでしょうか? ヘッダーの解説には、19と23についての記載がありませんでした。 ご回答からは、ヘッダーのルールを抑えておけば、いけるように感じましたが、PNGファイルやJPEGも同様の考え方でいけるでしょうか?

関連するQ&A

  • Excel VBAで画像解析

    Excel VBAで画像解析を行いたいのですが、その際に画像データを画素毎に抽出しなければなりません。bmpなど無圧縮のファイルなら、バイナリで読み込んで何とかなりますが、jpg等はどうにもなりません。 Excel VBAで画像ファイルの画素データを直接読み取る方法はありませんか。 他の開発言語を使ったほうがやりやすいのは承知の上ですが、解析結果も配列で返ってくるので、その後のグラフ化の処理などもExcel上で統合してやりたいのです。 宜しくお願いいたします。

  • 二値化画像の白黒ドット数を数える方法。

    お世話になります。 現在、画像解析をしておりまして 二値化した画像のドット数を計測したいと思っております。 ImagePro+や、WinRoofなどの画像解析ソフトを使えば簡単に出来ることはわかっています。 今お尋ねしたいのは、 フリーソフトでこのドット数をカウントしてくれるようなものは無いかと言うことです。 例えば、1000pix ×1000pix の画像の中に、白ドット:123500個 黒ドット:876500個 ・・・と言うようなことがしたいです。 ちなみに画像の二値化はPhotoShopCS2で実施しています。 以上、宜しくお願いします。

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

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

  • Imagejでのドットの数え方について

    添付した画像のような黒の背景に緑色のドットが描画されている画像から、緑色のドットが画像全体で何ドット存在しているのかを知りたいです。 ImageJというソフトでそれができるということまでは調べたのですが、どのようにしてドットを数えさせ、それを表示させるかがわかりませんでした。 ImageJでドットを数えさせてその結果を表示させるにはどのようにすればよいでしょうか。 以上、よろしくお願いします。

  • EXCELでビットマップ画像を操作できますか?

    初心者なのでチョット無謀な質問かも知れませんが、よろしくお願いします。 白地図のようなビットマップ画像があるとします。たとえばある市の集落を線画で描いたようなもの。これにある数値に応じて色を付けようと思っています。 Win付属のペイントで一つ一つ色を付けていけば良いのでしょうが、できれば、エクセルで数値を計算し、その結果で自動的に色が付かないかと思っています。無理でしょうか? たとえば、ビットマップの色を付けたい範囲のある座標と色のコードがエクセルに準備できているとして、自動色塗りはできるのでしょうか。 WINは98、エクセルは2000を使用しています。VBAの知識はほとんど無いに等しいです。(多分VBAを使わないと実現しないと思いますが・・・) 初心者だからできる大胆発言かも知れませんが、大量の色塗りに困惑しているのでどうか助けてください。要領を得ない質問で済みません。よろしくお願いします。

  • VBAで抽出した画像の数枚をフォームに表示

    VBAで指定したURLにある画像を抽出し、その画像をExcelシートに貼るものを作りましたが、そのうち3枚くらいをユーザフォーム上にも表示したいのですが、どのように記述したらよいでしょうか? 教えていただけたら幸いです。

  • VBAでボタンを押すと指定サイトの画像抽出

    お力を貸してください。 エクセルVBAで、テキストボックスとボタンを配置しました。 テキストボックス内にURLを入れてボタンを押すと、指定サイトに表示されている すべての画像を抽出して、エクセルに貼り付けるVBAを作りたいのですが、どのようなソースにすればよいでしょうか? 教えて頂けたら幸いです。 よろしくお願いいたします。

  • ビットマップの画素(?)数をカウントする

    カテ違いかもしれませんが、質問させて頂きます。 ビットマップデータの画像解析(?)について 例えば、モノクロビットマップの 色を測定するようなフリーソフトをご存知ないでしょうか? 白がいくつで、黒がいくつかを自動計算してくれるような イメージです。 宜しく御願いします。

  • Excel VBAで作成するにあたって、画像上部の元データを

    Excel VBAで作成するにあたって、画像上部の元データを 画像下部のように行列位の違いがあるような項目に データを抽出して転記するにはどうしたらよいでしょうか? 手順 ・支店ごとにデータを抽出し、シート名を付ける ・データを転記する VBA初心者で勉強中ですが大変困難です。 どなたか教えてください。よろしくおねがいいたします。

  • VBAのイベントプロシージャを使って自動的に枠線の色を変えたい。

    VBAのイベントプロシージャを使って自動的に枠線の色を変えたい。 エクセル2007。 VBA初心者です。 現在、書籍を購入して1からVBAを勉強中ですが、 どうしても以下のことを早く実現させたいと思ってますので質問させて下さい。 すべて黒色の枠線が引かれた表(A1:C20)があるとします。 このうちC列はリスト(りんご、みかん、メロン)からの入力しかできません。 更にC列のみ条件付き書式が入っていて、メロンを選択した時だけ そのセル内が黒色に塗りつぶされ、且つ文字が白色になる、いわゆる反転状態になります。 そこで、もし例えばC5とC6に「メロン」を入力したら C5もC6も黒色に塗りつぶされることになり、C5とC6の間にあった枠線は元々黒色ですから その線が全く見えなくなってしまいますよね? 私がVBAでやってみたいのは、この時(=黒色セルが2行続けて並んでしまう時)、 自動的にその間にある線の色だけ白色にするというプロシージャです。 また、この条件が成立して一度線の色が白になっても、 白を作らせた「メロン」を削除した時、元の黒色線に戻るようにもさせたいのですが これは、条件が消えれば自動的に戻るのでしょうか? 自力で調べた限り、Worksheet Changeを使って If~thenで作るのが一番近いのかなと思っていますが いかんせんまだまだ勉強不足であり、どうにも上手く実現できません。 これを実現するサンプルコードをできるだけ簡単に示していただけたら幸いです。 よろしくお願いします。

専門家に質問してみよう