Байер заказал дизеринг - PullRequest
       13

Байер заказал дизеринг

4 голосов
/ 14 декабря 2010

Я обновляю плагин для Paint.net, который я сделал несколько месяцев назад, он называется Simulate Color Depth, и он уменьшает количество цветов в изображении до выбранного BPP и долгое время включал в себя дизеринг, но НИКОГДА не заказывал дизеринг, и я подумал, что это будет хорошим дополнением, поэтому я начал искать в интернете что-то полезное, я попал на эту вики-страницу здесь http://en.wikipedia.org/wiki/Ordered_dithering, и попытался сделать так, как написано в псевдокод

for (int y = 0; x < image.Height; y++)
{  
    for (int x = 0; x < image.Width; x++)
    {
        Color color = image.GetPixel(x, y);  
        color.R = color.R + bayer8x8[x % 8, y % 8];  
        color.G = color.G + bayer8x8[x % 8, y % 8];  
        color.B = color.B + bayer8x8[x % 8, y % 8];  
        image.SetPixel(x, y, GetClosestColor(color, bitdepth);  
    }  
}

но результат слишком яркий, поэтому я решил проверить страницу вики еще раз, и затем я вижу, что справа от карты порогов есть "1/65", что заставило меня задуматься о распространении обеих ошибок (да, я знаю, , странно, да?) и деление значения, которое я получаю из bayer8x8[x % 8, y % 8] на 65, а затем умножение значения на цветовые каналы, но либо результаты были грязными, либо еще слишком яркими (насколько я помню), но результаты были совсем не похожи я видел в другом месте, слишком яркий, слишком высокий контраст или слишком грязный, и я не нашел ничего действительно полезного при поиске в Интернете, так кто-нибудь знает, как я могу заставить этот байерский сглаживание работать должным образом?

Заранее спасибо, Печенье

Ответы [ 3 ]

5 голосов
/ 22 января 2012

Я не думаю, что что-то не так с вашим оригинальным алгоритмом (из Википедии).Несоответствие яркости, вероятно, является артефактом гаммы монитора.Проверьте Позиционный алгоритм дизеринга Джоэла Илилуомы , приложение о гамма-коррекции из этой статьи об алгоритме дизеринга, изобретенном Джоэлем Илулуома (http://bisqwit.iki.fi/story/howto/dither/jy/#Appendix%201GammaCorrection), чтобы увидеть объяснение эффекта (примечание: страница довольно графическая)-heavy).

Между прочим, возможно, (очевидно, общедоступный) алгоритм, подробно описанный в этой статье, может быть решением вашей проблемы ...

1 голос
/ 14 января 2011

Нашел решение, levels - это количество цветов, которое должны иметь изображения назначения, а d - это делитель (это нормализовано из моего кода (который использует классы paint.net) для простого редактирования растрового изображения с помощью GetPixel и SetPixel )

    private void ProcessDither(int levels, int d, Bitmap image)
    {
        levels -= 1;
        double scale = (1.0 / 255d);
        int t, l;

        for ( int y = rect.Top; y < rect.Bottom; y++ )
        {
            for ( int x = rect.Left; x < rect.Right; x++)
            {
                Color cp = image.GetPixel(x, y);

                int threshold = matrix[y % rows][x % cols];

                t = (int)(scale * cp.R * (levels * d + 1));
                l = t / d;
                t = t - l * d;
                cp.R = Clamp(((l + (t >= threshold ? 1 : 0)) * 255 / levels));

                t = (int)(scale * cp.G * (levels * d + 1));
                l = t / d;
                t = t - l * d;
                cp.G = Clamp(((l + (t >= threshold ? 1 : 0)) * 255 / levels));

                t = (int)(scale * cp.B * (levels * d + 1));
                l = t / d;
                t = t - l * d;
                cp.B = Clamp(((l + (t >= threshold ? 1 : 0)) * 255 / levels));

                image.SetPixel(x, y, cp);
            }
        }
    }

    private byte Clamp(int val)
    {
        return (byte)(val < 0 ? 0 : val > 255 ? 255 : val);
    }
1 голос
/ 14 декабря 2010

Попробуйте:

color.R = color.R + bayer8x8[x % 8, y % 8] * GAP / 65;

Здесь GAP должно быть расстоянием между двумя ближайшими пороговыми значениями цвета.Это зависит от количества бит на пиксель.

Например, если вы конвертируете изображение, чтобы использовать 4 бита для красной компоненты каждого пикселя, общее количество красных уровней составляет 16.Это: R = 0, R = 17, R = 34, ... R = 255.Таким образом, GAP будет 17.

...