osekj Ответов: 1

Упорядоченное сглаживание - C# - цветовые значения на канал


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

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

Я в основном следую этому псевдокоду:
I = GetPixel(x,y)
col = Floor((k-1)*I)
re = (k-1)*I - col
if (re >= Bn[x mod n, y mod n])
    col++
SetPixel(x,y,layers[col])


Мой код:
private float[,] dither2x2Matrix =
        new float[,] { { 1, 3 },
                    { 4, 2 } };

    private float[,] dither3x3Matrix =
        new float[,] { { 3, 7, 4 },
                    { 6, 1, 9 },
                     { 2, 8, 5 } };

    public BitmapImage OrderedDitheringApply(BitmapImage FilteredImage, int colorsNum, int thresholdSize)
    {
        Bitmap bitmap = ImageConverters.BitmapImage2Bitmap(FilteredImage);

        float[,] bayerMatrix;

        if (thresholdSize == 2)
        {
            bayerMatrix = new float[2, 2];
            for (int i = 0; i < 2; ++i)
                for (int j = 0; j < 2; ++j)
                    bayerMatrix[i,j] = dither2x2Matrix[i,j] / 5;
        }
        else
        {
            bayerMatrix = new float[3, 3];
            for (int i = 0; i < 3; ++i)
                for (int j = 0; j < 3; ++j)
                    bayerMatrix[i, j] = dither3x3Matrix[i, j] / 10;
        }

        for (int i = 0; i < bitmap.Width; ++i)
            for(int j = 0; j < bitmap.Height; ++j)
            {

                Color color = bitmap.GetPixel(i, j);
                float colorIntensity = color.GetBrightness();

                float tempValue = (float)(Math.Floor((double)((colorsNum - 1) * colorIntensity)));
                float re = (colorsNum - 1) * colorIntensity - tempValue;

                if (re >= bayerMatrix[i % thresholdSize, j % thresholdSize])
                    tempValue++;

                if(tempValue == 0)
                    bitmap.SetPixel(i, j, Color.FromArgb(0,0,0));
                else
                    bitmap.SetPixel(i, j, Color.FromArgb(255, 255, 255));
            }

        return ImageConverters.Bitmap2BitmapImage(bitmap);
    }


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

Что я уже пробовал:

Реализовали рабочий код, но он не возвращает должных результатов

1 Ответов

Рейтинг:
2

RickZeeland

Может быть, эта статья CodeProject будет полезна: Простой - но довольно мощный - Квантователь палитры в C#[^]