2013-05-10 5 views
3

У меня есть тот же объект, который снимается в двух разных условиях освещения одной камерой.Насыщенность, переопределение значения для компенсации освещения

Предположим, что я принимаю насыщенность компонента красного цвета A, который становится A 'во втором изображении.

Если я знаю, что насыщенность белых букв равна B, как я могу получить хорошую оценку для B '? У них, похоже, есть зависимость, и интуитивно понятно, что у них может быть простая математическая зависимость, но я могу ошибаться.

Проще говоря: Найдите ожидаемое насыщение серых букв во втором изображении при наличии насыщения оригинального изображения красных и серых букв и красной насыщенности второго изображения. A, A ', B от 0 до 1.

Могу ли я отделить это уравнение от трех каналов HSV? Или какой тип трансформации я должен делать?

Мой текущий код нормализуется вокруг точки поворота (по умолчанию 1), и я обнаружил, что он терпит неудачу, когда B стремится к нулю:

float delta1 = (A - pivotpoint); 
float delta1new = Aprime - pivotpoint; 
float ratio = delta1new/delta1; 
float delta2 = B - pivotpoint; 
float delta2new = abs(ratio * delta2); 
float Bprime = pivotpoint - delta2new; 

enter image description here

ответ

1

Я не уверен, что я понял, что ты хочешь делать. Но если я не ошибаюсь, я думаю, вы должны попытаться разделить свои каналы не в HSV, а в HSL и работать с Luminance.

 

    #include "opencv2/opencv.hpp" 


    int main(int ac, char **av){ 

     cv::Mat src = cv::imread("./files/lena.jpg", -1); 
     cv::Mat hls; 
     // Create a hsv image with 3 channels and hue, sat e val with 1 channel. All with the same size 
     std::vector hlsChannels; 

     // Convert from Red-Green-Blue to Hue-Saturation-Luminance 
     cv::cvtColor(src, hls, CV_RGB2HLS); 
     cv::split(hls, hlsChannels); 

     cv::Mat hue = hlsChannels.at(0); 
     cv::Mat lum = hlsChannels.at(1); 
     cv::Mat sat = hlsChannels.at(2); 
     for (int y = 0; y (y, x) += 20; 
     } 
     } 
     hlsChannels.clear(); 
     hlsChannels.push_back(hue); 
     hlsChannels.push_back(lum); 
     hlsChannels.push_back(sat); 
     cv::Mat HLSColors; 
     cv::Mat RGBColors; 
     cv::merge(hlsChannels, HLSColors); 
     cv::cvtColor(HLSColors, RGBColors, CV_HLS2RGB); 
     cv::imwrite("lumLena.png", RGBColors); 
     return 0; 
    } 

Кроме того, посмотрите на выравнивание гистограммы, это может быть первый шаг в вашей работе.

http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.html#histogram-equalization

Надеется, что это помогло!

+0

Спасибо за предложение. Уравнивание гистограммы - это связанный метод, но я чувствую, что это не приведет к согласованным результатам в разных сценах. Я читал баланс белого, и кажется, что я делаю то, что - кроме красного баланса, потому что известна эта красная переписка. Проблема снова заключается в том, что в некоторых изображениях ошибка становится высокой. –

+0

Вы нашли это? – Poko

0

Вы должны сначала подумать о том, как вы хотите моделировать отношение, которое вы ищете. Чтобы сделать это, я привожу изображение в переписке вручную как можно лучше, и посмотрим на диаграммы рассеяния интересующей вас информации. I.e. (2D-точки), используя насыщенность (или другие значения, см. ниже) пикселей в виде координат. Это должно дать вам некоторое представление о подходящей модели.

Из моего опыта использования экспозиции я считаю, что линейная модель A' = m*A + x будет работать лучше, чем простая добавка или мультипликативная (A' = A + x или A' = m*A). Для решения линейной модели вам потребуется, по крайней мере, два соответствующих значения. Еще лучше использовать больше и решать в смысле наименьших квадратов. Вы могли бы также подумать об использовании полинома - вы увидите, что лучше всего подходят на диаграммах рассеяния.

Я бы также рассмотрел возможность применения поправки к каналам R, G и B отдельно, вместо использования HSV. RGB гораздо проще обрабатывать математически и часто дает хорошие результаты. В HSV вы, по существу, работаете в цилиндрической системе координат, а RGB - простое векторное пространство.

 Смежные вопросы

  • Нет связанных вопросов^_^