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

C# Remove gradient background from image

我将一张图像加载到 C# 中的位图中,该图像具有来自我扫描的文档的渐变背景。 它的一个例子可能如下图所示:

我现在在 C# 中的目标是删除背景,以便我拥有纯白色背景。现在我自己似乎找不到办法做到这一点。有没有办法以某种方式实现这一目标?

提前致谢。

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

  1. 使用GetPixel()获取像素颜色。
  2. 检查是否为文本(黑色)。
  3. 如果是,则移动到下一个像素。
  4. 如果不是,则使用 SetPixel() 将颜色更改为白色。

对于渐变,它应该足够了。对于更复杂的背景,它需要更复杂的算法。

这是使用 LockBits 的版本。

前提是不是黑色就改成白色

  1. 它会比 GetPixelSetPixel
  2. 快几个数量级
  3. 它使用指针
  4. 处理内存中的原始数据
  5. 迭代每个像素
  6. 检查 颜色 并根据需要将其更改为白色
  7. 保存图片

注意:显然这会破坏任何抗锯齿和平滑处理,某些图像类型会失败,以及其他各种问题。

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);
   }
}

输出