2017-11-27 11 views
0

画像の黒色を白で置き換えようとしています。逆も同様です。これは実際に私のOCRコードが白い背景でそれをよりよく読むことができるようになります。これは、現在私が聞きしたいが、実際のビットマップを扱ういくつかの他の質問を見てきましたが、どのように私はそれをクリップボードから直接アプローチしますか?クリップボード画像の色を置換する

Image img = Clipboard.GetImage(); 
      pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
      pictureBox1.Image = img; 

から画像を取得していますか

+0

であなただけの操作で少しやり過ぎ可能です文字通り白黒の画像が入っていますか、灰色や他の(微妙な)色が含まれていますか?もしそうなら、どのように処理したいのですか? –

+0

はこの白黒画像ですか? –

+0

ええと、私は画像が純粋な白黒であるとは思っていません。なぜなら、色の1つを置き換えると空の画像が作られるからです。 – Nyerguds

答えて

2

ColorMatrixを使用して別の解決策を。

ImageAttributes.SetColorMatrixを変更すると、イメージの色を変更できます。
明るさを微調整するためにしきい値を調整します。

ImageAttributes.SetThreshold

0に設定した場合は1

に設定すると、画像が反対、すべて白である。また、「反転」は、元のビットマップのカラーパターンに依存していることを考えるので、異なるアプローチを試してみてください。ピクセルの明るさを反転しないと、より良い解決策が得られることがあります。

どのような値が適しているかを確認するには、OCRを「訓練」する必要があります。

はこれらを見てみましょう:
Recoloring (MSDN)
ASCII Art Generator (CodeProject)

明るマトリックス: R =赤G =緑、B =青A =アルファチャンネルW =白(明るさ)
に輝度成分を変更します。ファイルから画像を取得し、 "反転"

R G B A W 
R [1 0 0 0 0] 
G [0 1 0 0 0] 
B [0 0 1 0 0] 
A [0 0 0 1 0] 
W [b b b 0 1] <= Brightness 

を得る

string _path = @"Image Path"; 
FileStream _fs = new FileStream(_path, FileMode.Open, FileAccess.Read); 
Image _img = new Bitmap(_fs); 

クリップボード

Image _img = Clipboard.GetImage(); 


なお、このようにしてグラフィックスコンテキストを作成することの制限を有すると言われなければなりません。

using System.Drawing; 
using System.Drawing.Imaging; 


var BW_Inverted_matrix = new float[][] 
{ 
    new float[] { -1, -1, -1, 0, 0}, 
    new float[] { -1, -1, -1, 0, 0}, 
    new float[] { -1, -1, -1, 0, 0}, 
    new float[] { 0, 0, 0, 1, 0}, 
    new float[] { 1.5f, 1.5f, 1.5f, 0, 1} //Adjusted: to combine with threshold 
}; 
var BW_matrix = new float[][] 
{ 
    new float[] { 1, 1, 1, 0, 0}, 
    new float[] { 1, 1, 1, 0, 0}, 
    new float[] { 1, 1, 1, 0, 0}, 
    new float[] { 0, 0, 0, 1, 0}, 
    new float[] {-1, -1, -1, 0, 1} 
}; 

using (Graphics gr = Graphics.FromImage(_img)) 
{ 
    // Adjust the threshold as needed 
    float _threshold = 0.2f; 
    ImageAttributes _ImageAttributes = new ImageAttributes(); 
    _ImageAttributes.SetColorMatrix(new ColorMatrix(BW_Inverted_matrix)); 
    _ImageAttributes.SetThreshold(_threshold); 
    Rectangle _rect = new Rectangle(0, 0, _img.Width, _img.Height); 
    gr.DrawImage(_img, _rect, 0, 0, _img.Width, _img.Height, GraphicsUnit.Pixel, _ImageAttributes); 
} 
0

あなたは直接あなたの画像のピクセルを置き換えるためにSystem.Drawimg.Imaging名前空間からColorMapImageAttributesクラスを使用することができます。

Image img = Clipboard.GetImage(); 
if (img != null) { 
    ColorMap[] cm = new ColorMap[1]; 
    cm[0] = new ColorMap(); 
    cm[0].OldColor = Color.Black; 
    cm[0].NewColor = Color.White; 
    ImageAttributes ia = new ImageAttributes(); 
    ia.SetRemapTable(cm); 
    using (Graphics g = Graphics.FromImage(img)) { 
    g.DrawImage(img, new Rectangle(Point.Empty, img.Size), 0, 0, img.Width, img.Height, 
       GraphicsUnit.Pixel, ia); 
    } 
    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
    pictureBox1.Image = img; 
} 
+0

前の 'pictureBox1'イメージを削除する価値はありますか?このコードも白と黒にマップされますか? – mjwills

+0

@mjwillsはいそうです。白を黒に切り替えるには、OldColorとNewColorの値を変更します。 – LarsTech

0

あなたのイメージは、B & Wであれば、それはOpenCVで非常に簡単です:

// bmp is your bitmap 
var inverted = (255 - bitmap.ToMat()).ToMat(). 
    .ToBitamp() // or 
    .ToWriteableBitmap() // or 
    .ToBitmapSource() 

この場合はOpenCVのは、全体のアプリ

関連する問題