Как реализовать алгоритм сглаживания от 24 до 3 бит?

Я пытаюсь реализовать алгоритм Байер-упорядоченной матрицы дизеринга, чтобы преобразовать 24-битное цветное изображение в 3-битное. Я прочитал страницу Википедии и несколько разделов учебника по этой теме, и я немного запутался. Это то, что я до сих пор:

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 + bayer4x4[x % 4, y % 4];  
        color.G = color.G + bayer4x4[x % 4, y % 4];  
        color.B = color.B + bayer4x4[x % 4, y % 4];  
        image[x][y] = SetPixel(x, y, GetClosestColor(color, bitdepth);  
    }  
}

Тем не менее, у меня нет способа реализации GetClosestColor... как я могу это сделать?

Кроме того, у меня не определена матрица bayer4x4, я считаю, что она должна выглядеть следующим образом:

1,  9,  3, 11
13, 5, 15, 7
4, 12,  2, 10
16, 8, 14, 6

1 ответ

      const   int BAYER_PATTERN_4X4[4][4]     =   {   //  4x4 Bayer Dithering Matrix. Color levels: 17
                                                {    15, 195,  60, 240  },
                                                {   135,  75, 180, 120  },
                                                {    45, 225,  30, 210  },
                                                {   165, 105, 150,  90  }

                                            };

void    makeColorDitherBayer4x4( BYTE* pixels, int width, int height )  noexcept
{
    int col = 0;
    int row = 0;

    for( int y = 0; y < height; y++ )
    {
        row = y & 3;    //  % 4
        
        for( int x = 0; x < width; x++ )
        {
            col = x & 3;    //  % 4

            const pixel blue    = pixels[x * 3 + 0];
            const pixel green   = pixels[x * 3 + 1];
            const pixel red     = pixels[x * 3 + 2];

            pixels[x * 3 + 0]   = (blue  < BAYER_PATTERN_4X4[col][row] ? 0 : 255);
            pixels[x * 3 + 1]   = (green < BAYER_PATTERN_4X4[col][row] ? 0 : 255);
            pixels[x * 3 + 2]   = (red   < BAYER_PATTERN_4X4[col][row] ? 0 : 255);

        }

        pixels  += width * 3;
    }
}
Другие вопросы по тегам