Привет, я хочу использовать контрастный фильтр в своем приложении, как эта ссылка или этот контраст, но с цветовой матрицей и дорожкой для оценки
Я уже нашел цветную матрицу для нее
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;
}
Значение t должно быть получено из нового значения контраста c. поэтому измените его назначение следующим образом:
float t = (1.0f - c)/2.0f;
Согласно этой хорошей ссылке на Руководство по ColorMatrix остальная часть кода матрицы выглядит нормально.
Примечание: я ошибался в отношении диапазона c !! Значение c не является абсолютным значением, но это фактор, который следует применять! Чтобы удвоить контраст, это должно быть 2f.
Примечание 2: ваш код не совсем понятен в отношении источника и цели; и поскольку вы меняете контраст на лету с трекболом, должно быть ясно, что до тех пор, пока изменение не будет применено,
Промежуточные результаты всегда должны вычисляться из одного и того же исходного растрового изображения.
Кроме того, чтобы трек-бэк был настолько интуитивно понятен, что начинался со значения 1.
Предложение Нико c = 1+ value;
будет хорошо работать с вашим исходным диапазоном -100 до +100 с внутренним значением 0 и вашим коэффициентом 0.01f.
Вот еще несколько объяснений по математике, стоящей за процессом. Если вы собираетесь принять ответ, примите ответ TaW, он был быстрее меня.
Регулировка контраста в основном делает следующее:
Итак, в формуле:
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);