Как конвертировать мобильное изображение в черно-белое C # - PullRequest
0 голосов
/ 07 ноября 2018

Мне нужно преобразовать изображение в черно-белое, полученное с помощью мобильной камеры.
Я прочитал вопросы и ответы, связанные с преобразованием изображения в черно-белое, но предоставленное решение мне не поможет. Ниже мое изображение, которое я сделал.

enter image description here

Поэтому я должен сохранить вышеуказанное изображение в папке своего приложения, преобразовав его в черно-белое в соответствии с требованиями.
Я пробовал ниже коды C #, но это дает мне неполное изображение.

Код 1

Bitmap bmp = new Bitmap(@"c:\test.jpg");

            Bitmap bw = bmp.Clone(new Rectangle(0, 0, bmp.Width, bmp.Height),
      PixelFormat.Format8bppIndexed);

Код 2

  Bitmap bmp = new Bitmap(@"c:\test.jpg");
int width = bmp.Width;
            int height = bmp.Height;
            int[] arr = new int[225];
            int i = 0;
            Color p;

            //Grayscale
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    p = bmp.GetPixel(x, y);
                    int a = p.A;
                    int r = p.R;
                    int g = p.G;
                    int b = p.B;
                    int avg = (r + g + b) / 3;
                    avg = avg < 128 ? 0 : 255;     // Converting gray pixels to either pure black or pure white
                    bmp.SetPixel(x, y, Color.FromArgb(a, avg, avg, avg));
                }
            }  

Но оба кода преобразуют исходное изображение, как показано ниже. enter image description here

Это может быть связано с затенением при захвате изображения с помощью мобильного телефона.
Пожалуйста, дайте мне знать, как я могу преобразовать это изображение в черно-белое без потери изображения.
Есть ли какая-нибудь библиотека, которая мне поможет?

1 Ответ

0 голосов
/ 14 ноября 2018

Снизьте порог до 90 здесь avg = avg < 90 ? 0 : 255;

или вы можете использовать EmguCV, это намного быстрее и проще, и они оба дают одинаковый результат.

Image<Gray, byte> img = new Image<Gray, byte>("1.jpg");
img._ThresholdBinary(new Gray(90), new Gray(255));

enter image description here

...