2017-11-27 4 views
0

Ich versuche, die schwarzen Farben eines Bildes durch Weiß zu ersetzen, und umgekehrt. Das ist eigentlich so, dass mein OCR-Code es besser auf weißen Hintergründen lesen kann. Es ist derzeit immer das Bild aus der ZwischenablageErsetzen der Farbe eines Bildes

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

ich einige anderen Fragen gesehen habe, wo theyre mit einem tatsächlichen Bitmap arbeiten, aber wie gehe ich es aus der Zwischenablage direkt?

+0

die Ist ankommendes Bild buchstäblich schwarz und weiß oder könnten Grautöne oder andere (subtile) Farben enthalten sein? Wenn ja, wie möchten Sie, dass diese behandelt werden? –

+0

ist dieses Schwarz-Weiß-Bild? –

+0

Ehh, ich bezweifle, dass das Bild rein schwarz und weiß ist, weil dann das Ersetzen einer der Farben ein leeres Bild erzeugen würde. – Nyerguds

Antwort

2

Eine andere Lösung, um die Colormatrix verwendet wird.

Sie können dann ImageAttributes.SetColorMatrix ändern, um die Farbe eines Bildes zu ändern.
Regulieren Sie den Schwellenwert, um die Helligkeit fein einzustellen.

ImageAttributes.SetThreshold

Wenn auf 0 gesetzt, ist ein Bild, ganz weiß, das Gegenteil gesetzt, wenn auf 1

Beachten Sie auch, dass die „Inversion“ ist abhängig von der ursprünglichen Bitmap Farbmuster, so verschiedene Ansätze versuchen . Manchmal führt das Umkehren der Pixelhelligkeit nicht zu einer besseren Lösung.

Ihr OCR muss "trainiert" werden, um zu überprüfen, welche Werte besser zu ihm passen.

einen Blick auf diese nehmen:
Recoloring (MSDN)
ASCII Art Generator (CodeProject)

Helligkeit Matrix: R = Rot G = Grün B = Blau A = Alpha-Kanal W = Weiß (Helligkeit)
die Helligkeitskomponente ändern zu eine "Inversion" erhalten

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 

Holen Sie sich das Bild aus einer Datei

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

oder die Zwischenablage

Image _img = Clipboard.GetImage(); 


Es muss gesagt werden, dass auf diese Weise einen Grafikkontext zu schaffen Grenzen hat.

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

können Sie die ColorMap und ImageAttributes Klassen aus dem direkt System.Drawimg.Imaging Namespace verwenden, um die Pixel in Ihrem Bild zu ersetzen:

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

Würde es sich lohnen, das vorherige imagebox1-Bild zu entfernen? Wird dieser Code auch weiß zu schwarz zuordnen? – mjwills

+0

@mjwills Ja würde es. Um Weiß in Schwarz zu ändern, ändern Sie einfach die OldColor- und NewColor-Werte. – LarsTech

0

wenn Ihr Bild B & W ist, ist es sehr einfach, in OpenCV:

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

OpenCV kann ein wenig zu viel des Guten, wenn dies die einzige Manipulation in der gesamten App

Verwandte Themen