контраст с цветовой матрицей

1

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

float c = mytrackbar.value * 0.01f //maxTrackbarValue = 100, minTrackbarValue = -100 
float t = 0.01f;
cmPicture = new ColorMatrix(new float[][] {
    new float[] {c,0,0,0,0},
    new float[] {0,c,0,0,0},
    new float[] {0,0,c,0,0},
    new float[] {0,0,0,1,0},
    new float[] {t,t,t,0,1}
});

но результат сильно отличается. Я пытаюсь изменить 0.01f в ~ c ~ и 0.01f в ~ t ~ значение, но оно дает результат как яркость (ex: c = mytrackbar.value * 0.04f)

Интересно, что ~ c ~ & ~ t ~ значение и сколько max и min range я должен использовать для созданного контраста


Обновление @Nico

    private void myTrackBar_ValueChanged(object sender, EventArgs e) {
        imageHandle = imageHandleTemp.Bitmap;
        myNumericUpDown.Text = myTrackBar.Value.ToString();
        float value = myTrackBar.Value * 0.01f;

        Bitmap bmpInverted = new Bitmap(imageHandle.Width, imageHandle.Height);
        ImageAttributes ia = new ImageAttributes();
        ColorMatrix cmPicture = new ColorMatrix();

        float c = value;
        float t = 0.01f;
        cmPicture = new ColorMatrix(new float[][] {
            new float[] {c,0,0,0,0},
            new float[] {0,c,0,0,0},
            new float[] {0,0,c,0,0},
            new float[] {0,0,0,1,0},
            new float[] {t,t,t,0,1}
        });

        ia.SetColorMatrix(cmPicture);
        Graphics g = Graphics.FromImage(bmpInverted);
        g.DrawImage(imageHandle, new Rectangle(0, 0, imageHandle.Width, imageHandle.Height), 0, 0, imageHandle.Width, imageHandle.Height, GraphicsUnit.Pixel, ia);
        g.Dispose();

        Image<Bgr, Byte> myImage = new Image<Bgr, byte>(bmpInverted);
        imageBoxCamera.Image = myImage;
    }
Теги:
colormatrix
contrast

2 ответа

2
Лучший ответ

Значение t должно быть получено из нового значения контраста c. поэтому измените его назначение следующим образом:

float t = (1.0f - c)/2.0f;

Согласно этой хорошей ссылке на Руководство по ColorMatrix остальная часть кода матрицы выглядит нормально.

Примечание: я ошибался в отношении диапазона c !! Значение c не является абсолютным значением, но это фактор, который следует применять! Чтобы удвоить контраст, это должно быть 2f.

Примечание 2: ваш код не совсем понятен в отношении источника и цели; и поскольку вы меняете контраст на лету с трекболом, должно быть ясно, что до тех пор, пока изменение не будет применено,

  • Промежуточные результаты всегда должны вычисляться из одного и того же исходного растрового изображения.

  • Кроме того, чтобы трек-бэк был настолько интуитивно понятен, что начинался со значения 1.

  • И, наконец, чтобы уменьшить значения контраста, нужно перевести на 0 <c <1.

Предложение Нико c = 1+ value; будет хорошо работать с вашим исходным диапазоном -100 до +100 с внутренним значением 0 и вашим коэффициентом 0.01f.

  • 0
    хм ... я думаю, что проблема сейчас в предельном максимальном и минимальном значении трекбара ... я использовал 100 как максимальное и -100 как минимальное .... когда максимальное значение трекбара изображение становится нормальным и когда в минимальном это почти так же, как отрицательный
  • 0
    ха, я не видел этого, так как это было просто вне поля зрения. Также: я ошибся в своем комментарии о диапазоне c! Это не абсолютное значение, а фактор! Таким образом, чтобы удвоить контраст, это должно быть 2f.
3

Вот еще несколько объяснений по математике, стоящей за процессом. Если вы собираетесь принять ответ, примите ответ TaW, он был быстрее меня.

Регулировка контраста в основном делает следующее:

  1. Он сдвигает все значения пикселей на -0.5 (так что средне-серый становится 0)
  2. Он применяет фактор ко всем значениям пикселей
  3. Он возвращает сдвиг

Итак, в формуле:

newValue = factor * (oldValue - 0.5) + 0.5
         = factor * oldValue - factor * 0.5 + 0.5
         = factor * oldValue + 0.5 * (1 - factor)

Для одноканального изображения мы можем преобразовать это в матричное умножение:

(newValue, 1) = (oldValue, 1) * /        factor      , 0\     <-- this is c, 0
                                \ 0.5 * (1 - factor) , 1/     <-- this is t, 1

Для многоканальных изображений матрица 2x2 становится матрицей 5x5 (четыре канала + w-канал для переводов) с c и t в указанных вами положениях.

Имейте в виду, что коэффициент 1 ничего не меняет. Коэффициент 0 делает изображение в целом серо-серым. Поэтому вы можете настроить свой расчет c:

c = 1 + value;
t = 0.5f * (1.0f - c);
  • 0
    отлично ... это работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню