2013-05-10 37 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而不是HSV,並且在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

感謝您的建議。直方圖均衡是一種相關的方法,但我覺得它不會在不同的場景中產生一致的結果。我一直在閱讀白平衡,看起來我正在做的是 - 除了紅色平衡,因爲特定的紅色對應是已知的。問題再次是,在一些圖像中,錯誤變得很高。 – 2013-05-10 15:29:39

+0

你有沒有找到它? – Poko 2013-05-15 14:40:41

0

你應該首先考慮你想如何建模你正在尋找的關係。要做到這一點,我會盡可能手動地將圖像手動對應,然後查看您感興趣的信息的散點圖。使用像素的飽和度(或其他值,見下文)繪製2D點作爲座標。這應該給你一個適當的模型的一些想法。

根據我對曝光匹配的經驗,我認爲線性模型A' = m*A + x將比簡單的加法或乘法(A' = A + xA' = m*A)更好地工作。但是,要求解線性模型,至少需要兩個相應的值。更好地使用更多,並以最小二乘意義解決。你也可以考慮使用多項式 - 你會發現最適合散點圖。

我還會考慮分別對R,G和B通道應用校正,而不是使用HSV。 RGB在數學上更容易處理,並且通常也會給出好的結果。在HSV中,你基本上是在一個圓柱座標系中操作,而RGB是一個簡單的向量空間。