替换图像的颜色

时间:2017-11-27 23:46:23

标签: c#

我试图用白色替换图片的黑色,反之亦然。这实际上是我的OCR代码可以更好地在白色背景上读取它。它目前从剪贴板获取图像

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

我已经看到了一些其他问题,他们正在使用实际的位图,但我如何直接从剪贴板处理它?<​​/ p>

3 个答案:

答案 0 :(得分:2)

使用ColorMatrix的另一种解决方案。

您可以修改ImageAttributes.SetColorMatrix以更改图像的颜色 调节阈值以微调亮度。

ImageAttributes.SetThreshold

如果设置为0,则图像全白,如果设置为1则相反。

还要考虑“反转”取决于原始位图颜色模式,因此请尝试不同的方法。有时不反转像素的亮度可以为您提供更好的解决方案。

您必须“训练”OCR,以验证哪些值更适合它。

看看这些:
Recoloring (MSDN)
ASCII Art Generator (CodeProject)

亮度矩阵: R =红色G =绿色B =蓝色A = Alpha通道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);

或ClipBoard

Image img = Clipboard.GetImage();


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


var bwInverted_mx = 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_mx = 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))
using (ImageAttributes attributes = new ImageAttributes())
{
  // Adjust the threshold as needed
  float threshold = 0.2f;
  //attributes.SetColorMatrix(new ColorMatrix(bw_mx));
  attributes.SetColorMatrix(new ColorMatrix(bwInverted_mx));
  attributes.SetThreshold(threshold);
  Rectangle rect = new Rectangle(0, 0, img.Width, img.Height);
  gr.DrawImage(img, rect, 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, attributes);
}

答案 1 :(得分:0)

您可以使用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; } 命名空间中的ColorMapImageAttributes类直接替换图片中的像素:

p => { OnReceiveFirst((FirstPacket)p); }

答案 2 :(得分:0)

如果您的图片是B&amp; W,则OpenCV

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

OpenCV可能有点矫枉过正,如果这只是你在整个应用程序中的唯一操作