トップ回答者
画像の「白」以外の部分を際立たせる

質問
-
失礼します。
jpgファイルを読んで一部分を加工し、DataGridViewに表示させています。
このとき、各jpgファイルは手書きのものをスキャナしたもののため、どうしても濃い薄いが出てしまいます。
そこでなのですが、「白」以外の部分を際立たせる(たとえばすべて黒!)にするにはどうすればいいのでしょうか?
(背景は必ず白です)
もちろん、多少の「ゴミ」が入ってもOKです。
雑で申し訳ございません。
よろしくお願いします。
(ソースはループなどは割愛しています)
'//切り取る部分
Dim Rect As New Rectangle(0,0,100,100)
'//イメージの原本
Dim imgBefore As Image = Image.FromFile(strParaPathイメージ)
'//加工後のイメージ
Dim imgSave As New Bitmap(100,100) '加工後の大きさ。WとH。原則RectのWとHと同じ。
'//グラフィックオブジェクト(≒作成するイメージを描画してくれる「もの」)
Dim g As Graphics = Graphics.FromImage(imgSave)
'//新しいイメージを描画する。「原本」の「原点(左上」)から計算して「Rect」の範囲を「ピクセル」で)
g.DrawImage(imgBefore, 0, 0, Rect, GraphicsUnit.Pixel)
'//表示
dgv採点作業.Item("Column画像", intWRow).Value = imgSave
'//破棄
g.Dispose()
回答
-
う~ん・・・、bmpファイルだったら
Dim bmp As Bitmap = New Bitmap("ファイルパス") For x As Integer = 0 To bmp.Width - 1 For y As Integer = 0 To bmp.Height - 1 Dim color As System.Drawing.Color = bmp.GetPixel(x, y) If Not ( _ color.A = Drawing.Color.White.A AndAlso _ color.R = Drawing.Color.White.R AndAlso _ color.G = Drawing.Color.White.G AndAlso _ color.B = Drawing.Color.White.B) AndAlso _ Not ( _ color.A = Drawing.Color.Transparent.A AndAlso _ color.R = Drawing.Color.Transparent.R AndAlso _ color.G = Drawing.Color.Transparent.G AndAlso _ color.B = Drawing.Color.Transparent.B) Then bmp.SetPixel(x, y, Drawing.Color.Black) End If Next Next
とかでいけそうなんだけど・・・
jpgファイルだと荒くなるかなぁ- 回答としてマーク アースワーム 2012年7月24日 6:26
-
アースワームさんこんにちは、おのでらです。
プログラムがわからないのか考え方がわからないのか、どちらかはわかりませんが考え方のほうだけ。(プログラムはやりかたがいろいろあるので)
きれいじゃなくてもいいのであれば、簡単な方法で2値化の方法(白と黒の2色だけ)があります。各ピクセルの RGB (0~255形式)を読み取ってそれぞれの値を加算し、700 以上なら白、700 未満なら黒に置き換えます。(700 は適当につけた閾値なので任意に変えてください)。グレースケールの概念でいけば RGB それぞれの比重があったりしますが、そこは長くなりそうなので割愛します(^^;) スキャナで読み取った画像が 白用紙に黒線だけのものであればこれでも十分に対応できると思います。
もう少し手を込めばほかにも方法がありますが、元画像がよくわからないのでまずこれでいけるかどうか検討してみてください。
【追記】内容がかぶった orz
おのでら (http://sorceryforce.com/)
すべての返信
-
う~ん・・・、bmpファイルだったら
Dim bmp As Bitmap = New Bitmap("ファイルパス") For x As Integer = 0 To bmp.Width - 1 For y As Integer = 0 To bmp.Height - 1 Dim color As System.Drawing.Color = bmp.GetPixel(x, y) If Not ( _ color.A = Drawing.Color.White.A AndAlso _ color.R = Drawing.Color.White.R AndAlso _ color.G = Drawing.Color.White.G AndAlso _ color.B = Drawing.Color.White.B) AndAlso _ Not ( _ color.A = Drawing.Color.Transparent.A AndAlso _ color.R = Drawing.Color.Transparent.R AndAlso _ color.G = Drawing.Color.Transparent.G AndAlso _ color.B = Drawing.Color.Transparent.B) Then bmp.SetPixel(x, y, Drawing.Color.Black) End If Next Next
とかでいけそうなんだけど・・・
jpgファイルだと荒くなるかなぁ- 回答としてマーク アースワーム 2012年7月24日 6:26
-
アースワームさんこんにちは、おのでらです。
プログラムがわからないのか考え方がわからないのか、どちらかはわかりませんが考え方のほうだけ。(プログラムはやりかたがいろいろあるので)
きれいじゃなくてもいいのであれば、簡単な方法で2値化の方法(白と黒の2色だけ)があります。各ピクセルの RGB (0~255形式)を読み取ってそれぞれの値を加算し、700 以上なら白、700 未満なら黒に置き換えます。(700 は適当につけた閾値なので任意に変えてください)。グレースケールの概念でいけば RGB それぞれの比重があったりしますが、そこは長くなりそうなので割愛します(^^;) スキャナで読み取った画像が 白用紙に黒線だけのものであればこれでも十分に対応できると思います。
もう少し手を込めばほかにも方法がありますが、元画像がよくわからないのでまずこれでいけるかどうか検討してみてください。
【追記】内容がかぶった orz
おのでら (http://sorceryforce.com/)