c # — OpenCV: как увеличить цветовой канал

В изображении RGB (с веб-камеры) я ищу способ увеличить интенсивность / яркость зеленого цвета. Рад, если кто-нибудь может дать отправную точку.

Я использую AFORGE.NET в C # и / или OpenCV непосредственно в C ++.

0

Решение

в общем случае умножение значений пикселей представляет собой увеличение контрастности, а сложение — увеличение яркости.

в с #

где у вас есть массив до первого пикселя в изображении, например:

byte[] pixelsIn;
byte[] pixelsOut; //assuming RGB ordered data

и значения контрастности и яркости, такие как это:

float gC = 1.5;
float gB = 50;

Вы можете умножить и / или добавить к зеленому каналу для достижения желаемого эффекта: (r — строка, c — столбец, ch — nr каналов)

pixelsOut[r*w*ch + c*ch]   = pixelsIn[r*w*ch + c*ch] //red
int newGreen = (int)(pixelsIn[r*w*ch + c*ch+1] * gC + gB);  //green
pixelsOut[r*w*ch + c*ch+1] = (byte)(newGreen > 255 ? 255 : newGreen < 0 ? 0 : newGreen); //check for overflow
pixelsOut[r*w*ch + c*ch+2] = pixelsIn[r*w*ch + c*ch+2]//blue

очевидно, вы хотели бы использовать указатели здесь, чтобы ускорить процесс.

(Обратите внимание: этот код НЕ БЫЛ ПРОВЕРЕН)

1

Другие решения

Для AFORGE.NET я предлагаю использовать ColorRemapping класс для сопоставления значений в вашем зеленом канале с другим значением. Функция отображения должна быть вогнутой от [0,255] до [0,255], если вы хотите увеличить яркость без потери деталей.

0

Это то, что я придумал после прочтения многих страниц документации AForge.NET и OpenCV. Если вы сначала примените фильтр насыщенности, вы можете получить головокружительное изображение. Если вы примените его позже, вы получите намного более четкое изображение, но некоторые «светло-зеленые» пиксели могли быть потеряны раньше при применении фильтра HSV.

                        // apply saturation filter to increase green intensity
var f1 = new SaturationCorrection(0.5f);
f1.ApplyInPlace(image);

var filter = new HSLFiltering();
filter.Hue = new IntRange(83, 189);         // all green (large range)
//filter.Hue = new IntRange(100, 120);      // light green (small range)

// this will convert all pixels outside the range into gray-scale
//filter.UpdateHue = false;
//filter.UpdateLuminance = false;

// this will convert all pixels outside that range blank (filter.FillColor)
filter.Saturation = new Range(0.4f, 1);
filter.Luminance = new Range(0.4f, 1);

// apply the HSV filter to get only green pixels
filter.ApplyInPlace(image);
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector