C # Удалить градиентный фон с изображения - PullRequest
1 голос
/ 30 апреля 2019

У меня есть изображение, загруженное в растровое изображение в C # с градиентным фоном из документа, в котором я отсканировал. Пример этого может быть как на картинке ниже:

Моя цель в C # теперь удалить фон, чтобы у меня был сплошной белый фон. Теперь я сам не могу найти способ сделать это. Есть ли способ достичь этого в пути?

Заранее спасибо.

enter image description here

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Вот версия, использующая LockBits.

Предполагается, что если оно не черное, измените его на белое.

  1. Это будет на порядок быстрее GetPixel и SetPixel
  2. Работает с необработанными данными в памяти с использованием указателей
  3. повторяется через каждый пиксель
  4. Проверяет цвет и при необходимости меняет его на белый
  5. Сохраняет изображение

Примечание : очевидно, что это уничтожит любое сглаживание и сглаживание, произойдет сбой для определенных типов изображений и других проблем.

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

выход

enter image description here

0 голосов
/ 30 апреля 2019

Если вы знаете цвета градиента (например, только часть цвета RGB, отвечающего за красные изменения) или хотя бы цвет текста (например, если он всегда черный), то вы можете перебирать все пиксели изображения, а затем:

  1. Используйте GetPixel(), чтобы получить цвет пикселей.
  2. Убедитесь, что это текст (черный).
  3. Если это так, то перейти к следующему пикселю.
  4. Если это не так, измените цвет на белый с помощью SetPixel().

Для градиента этого должно быть достаточно. Для более сложных фонов потребуется более сложный алгоритм.

...