Какой самый быстрый способ конвертировать изображение в чисто черно-белое в C #? - PullRequest
4 голосов
/ 15 февраля 2011

До того, как кто-то осудил меня за то, что я не проверял другие посты, я уже сделал это.У меня есть конкретный вопрос об одном из методов, которые существуют для преобразования изображения в градации серого.

Я прочитал другие посты по SO и в основном скопировал технику 3 (ColorMatrix) из учебного пособия на thisсайт .Работает очень и очень быстро.

Проблема, с которой я столкнулся, заключается в том, что мне нужно чистое черно-белое изображение.(то есть: если среднее (R, B, G)> 200 => белый или черный).Я реализовал это простым способом, и на самом деле он занимает почти 10 раз дольше, чем алгоритм оттенков серого из учебника.

Я не специалист по обработке изображений, и мне было интересно, есть ли способ изменить фрагментиз учебника для преобразования изображений в чисто черный и белый.Если нет, то подойдет любой эффективный способ.

РЕДАКТИРОВАТЬ:

Вот код, который я использую для черно-белого (без мозгового подхода):

public Bitmap make_bw(Bitmap original) {

    Bitmap output = new Bitmap(original.Width, original.Height);

    for (int i = 0; i < original.Width; i++) {

        for (int j = 0; j < original.Height; j++) {

            Color c = original.GetPixel(i, j);

            int average = ((c.R + c.B + c.G) / 3);

            if (average < 200)
                output.SetPixel(i, j, Color.Black);

            else
                output.SetPixel(i, j, Color.White);

        }
    }

    return output;       

}

Ответы [ 3 ]

3 голосов
/ 15 февраля 2011
2 голосов
/ 27 июня 2013

Я использую этот простой код:

public Bitmap GrayScaleFilter(Bitmap image)
{
    Bitmap grayScale = new Bitmap(image.Width, image.Height);

    for (Int32 y = 0; y < grayScale.Height; y++)
        for (Int32 x = 0; x < grayScale.Width; x++)
        {
            Color c = image.GetPixel(x, y);

            Int32 gs = (Int32)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);

            grayScale.SetPixel(x, y, Color.FromArgb(gs, gs, gs));
        }
    return grayScale;
}
2 голосов
/ 22 июля 2012

Этот парень делает три теста, самыми быстрыми из которых являются ColorMatrix, как упомянуто здесь. Внешняя ссылка о преобразовании изображения

НО один из комментаторов утверждает, что причина в том, что прямой и unsafe метод доступа к пикселям медленнее, это вызовы .Width и .Height в растровых изображенияхи копирование этих значений в локальные переменные существенно ускоряет прямой доступ к пикселям.

Я проверил это, и кажется, что небезопасный метод примерно в 2,5 раза быстрее, чем при использовании ColorMatrix.Но, возможно, он также более сложен и, очевидно, требует, чтобы в проекте был разрешен код unsafe, что может быть нежелательно.

...