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

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

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~, но это дает только результат, подобный яркости (например: c = mytrackbar.value * 0.04f )

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


Обновить @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;
    }

person Neversaysblack    schedule 26.05.2014    source источник
comment
Пожалуйста, добавьте соответствующие части вашего кода. Как вы применяете эту матрицу?   -  person Nico Schertler    schedule 26.05.2014
comment
Перейдите по этой ссылке. Там написано, что t = (1.0 - c) / 2.0 и c = contrast. Все значения идут от 0 до 1.   -  person TaW    schedule 26.05.2014
comment
@NicoSchertler, пожалуйста, проверьте мой обновленный пост   -  person Neversaysblack    schedule 26.05.2014
comment
@TaW извините, но результат все тот же, я использовал этот код t=(float)(1.0 - c) / 2.0, t = (1.0 - c) / 2.0 удвоен, поэтому мне нужно привести к float .. пожалуйста, проверьте мой обновленный пост тоже, может быть, вы можете помочь исправить это   -  person Neversaysblack    schedule 26.05.2014


Ответы (2)


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

поплавок t = (1,0f - c) / 2,0f;

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

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

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

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

  • Кроме того, трекбар должен быть инициализирован так, чтобы он начинался со значения 1.

  • И, наконец, для уменьшения значения контрастности следует перевести в 0 ‹ c ‹ 1.

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

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

Вот некоторые дополнительные пояснения о математике, лежащей в основе этого процесса. Если вы собираетесь принять ответ, примите ответ 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);
person Nico Schertler    schedule 26.05.2014