C#从图像中去除渐变背景

C#从图像中去除渐变背景,c#,image-processing,bitmap,gradient,C#,Image Processing,Bitmap,Gradient,我将一幅图像加载到C#格式的位图中,带有我扫描的文档中的渐变背景。 一个例子可能如下图所示: 我在C#中的目标是去除背景,这样我就有了纯白的背景。现在我自己似乎找不到一个方法来做这件事。有没有办法在某种程度上实现这一点 提前谢谢 如果您知道渐变颜色(例如,只有部分RGB颜色会引起红色变化)或至少知道文本的颜色(例如,如果文本始终为黑色),则可以遍历图像的所有像素,然后: 使用GetPixel()获取像素颜色 检查是否为文本(黑色) 如果是,则移动到下一个像素 如果不是,则使用SetPixel()

我将一幅图像加载到C#格式的位图中,带有我扫描的文档中的渐变背景。 一个例子可能如下图所示:

我在C#中的目标是去除背景,这样我就有了纯白的背景。现在我自己似乎找不到一个方法来做这件事。有没有办法在某种程度上实现这一点

提前谢谢


如果您知道渐变颜色(例如,只有部分RGB颜色会引起红色变化)或至少知道文本的颜色(例如,如果文本始终为黑色),则可以遍历图像的所有像素,然后:

  • 使用
    GetPixel()
    获取像素颜色
  • 检查是否为文本(黑色)
  • 如果是,则移动到下一个像素
  • 如果不是,则使用
    SetPixel()
    将颜色更改为白色
    对于梯度,它应该足够了。对于更复杂的背景,它需要更复杂的算法。

    这里有一个使用
    锁位的版本

    前提是,如果它不是黑色的,则将其更改为白色

  • GetPixel
    SetPixel
  • 它使用指针处理内存中的原始数据
  • 遍历每个像素
  • 检查颜色并根据需要将其更改为白色
  • 保存图像
  • 注意:显然,这将破坏任何抗锯齿和平滑,对于某些图像类型和其他各种问题,它将失败

    使用(var bmp=新位图(@“D:\Test.png”))
    {
    var data=bmp.LockBits(新矩形(0,0,bmp.Width,bmp.Height),ImageLockMode.ReadWrite,PixelFormat.Format32bppPArgb);
    var white=Color.white.ToArgb();
    var black=Color.black.ToArgb();
    尝试
    {
    var length=(int*)data.Scan0+bmp.Height*bmp.Width;
    对于(var p=(int*)data.Scan0;p
    输出


    我想你需要看看专门的图像处理库——我知道这是怎么回事,所以我一定要试试这个。但现在我也在想,这段代码是否可以转换为,例如,如果扫描文档中有一张照片,里面有多种颜色,而您不知道它们是什么颜色?@DLP只要颜色不是黑色就可以了,但是我认为您可以看到它是如何工作的,所以您应该能够根据其他需要修改它
    using (var bmp = new Bitmap(@"D:\Test.png"))
    {
       var data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);
       var white = Color.White.ToArgb();
       var black = Color.Black.ToArgb();
    
       try
       {
          var length = (int*)data.Scan0 + bmp.Height * bmp.Width;
          for (var p = (int*)data.Scan0; p < length; p++)
             if (*p != black) *p = white;
       }
       finally
       {
          // unlock the bitmap
          bmp.UnlockBits(data);
          bmp.Save(@"D:\Output.Bmp", ImageFormat.Bmp);
       }
    }