come from :?https://www.cnblogs.com/whw19818/archive/2016/08.html
ISP(Image Singal Process)算法廣泛應用于安防監控,汽車電子等等一系列產品中。
ISP主要算法包括:3A---[AWB(自動白平衡),AE(自動曝光),AF(自動對焦)],CFA插值,暗角補償,壞點檢測,2D/3D去噪,銳化,VDE,Color Matrix,圖片縮放,數字寬動態,伽馬矯正等等一系列圖像處理算法.
? ? ? ?所有這些算法的最終目的都是使圖像看上去更清晰,更好,使人們看上去有一個更好的感受。那么學習ISP算法需要哪些知識呢?其實也就是一些最基本的圖像處理方面的知識,如:圖像色彩空間:RGB,YUV,LAB,XYZ,HSV空間等等。在研究算法的時候,只要多動腦多查資料,相信都會有一個好的收獲。
自動白平衡(auto white balance )
自動白平衡:主要解決圖像偏色的問題,如果圖像偏色,我們就可以用自動白平衡算法給矯正過來。
有以下幾個問題要考慮:
1,我們看到的圖像是否存在偏色,如果不偏色就不需要矯正,只有偏色的圖片才需要矯正。
? ? ? ??注:實際中,圖像都存在偏色,只是情況不一樣,有的看起來失真嚴重,有的看起來也還很自然。
2,對于偏色的情況我們采用什么方法來對圖片進行矯正。
首先,檢測偏色。這一算法,主要用到圖像的一些空間變換的知識。RGB—XYZ-—Lab,對圖像偏色的檢測,主要在Lab空間進行。
其次,矯正。矯正最主要的就是對圖像進行找白點,就是白色參考點的確認。這一過程主要用圖像YCbCR空間。
如果圖片不存在偏色,則對每個像素點必須滿足:Cb=0,Cr=0; ? 但實際情況中,Cb和Cr的值是不可?能全部為零的。我們可以用一下判斷條件:
?(1) Y>T1(T1事先預設),|Cb|<X,|Cr|<Y;
?(2)|Y-|cb|-|Cr||>T1
(3) 對圖片進行分塊,然后利用(1)或者(2)進行判斷白點
?具體算法就不一一列出了,呵呵
?
ISP圖像處理算法之一黑電平校正
? ? ? ?本文主要介紹ISP pipeline里邊算法之一黑電平校正:
? ? ? ? 眾所周知,CMOS傳感器采集的信息經過一系列轉換,最后生成原始RAW格式數據,RAW數據每個像素點只有一種顏色信息,只是RGB的一個, 但是由于sensor對綠色光的頻率基本可以全部通過,故RAW data數據里邊,有兩個G一個R,一個B。 我們要想得到RGB數據就必須利用已有的信息來得到缺失的信息,這個處理后面專門介紹。這里接著黑電平校正說。
? ? ? ? 我們知道圖像數據一般為0--255,但sensor在出廠的時候,廠家一般會設置圖像數據輸出范圍如5-250等,反正最低電平不為零。因此我們就需要對圖像數據范圍進行調整,使其最小值為零,這就是黑電平校正。
? ? ? ? ?黑電平校正有兩種方法:一種是直接在RAW data數據上減去一個值,可以RGB減的值一樣,也可以不一樣,目前大多數廠家如,安霸,海思等基本都是采用這一做法。一種是利用一次函數,這個比較麻煩,就不介紹了。
? ? ? ? ?PS:這個是ISP里面最簡單做法,以后會詳細介紹一些其他復雜的算法。
?
ISP圖像處理算法之---Demosaic
目前市場上主流傳感器為Coms傳感器,sensor出來的的數據格式為bayer數據格式,這種格式,每個像素點只有三個顏色通道中的一個,如圖1所示 :圖1 ?bayer數據格式
Demosaic的目的就是有bayer數據恢復出完整的RGB數據。
方法:色差和色比,一般用色差的理論
常見算法:雙線性,基于梯度,自適應,及其他一些方法,具體原理網上都能查的到,此處不一一介紹,最后貼幾張自己做的一個Demosaic和常見算法的一個對比
?
???? 原圖
雙線性插值
基于梯度插值
自適應插值
基于差值的插值方法
? ?自己方法
?
ISP模塊之RAW DATA去噪(一)
ISP(Image Signal Processor),圖像信號處理器 ,主要用來對前端圖像傳感器輸出信號處理的單元,主要用于手機,監控攝像頭等設備上。
? ??RAW DATA ,可以理解為:RAW圖像就是CMOS或者CCD圖像感應器將捕捉到的光源信號轉化為數字信號的原始數據,是無損的,包含了物體原始的顏色信息等。RAW數據格式一般采用的是Bayer排列方式,通過濾波光片,產生彩色濾波陣列(CFA),鑒于人眼對綠色波段的色彩比較敏感,Bayer數據格式中包含了50%的綠色信息,以及各25%的紅色和藍色信息。
? Bayer排列格式有以下4種:
? 1.| R | G |? ?2.| B | G |? ? 3.| G | R |? ? 4.| G | B |
? ? ?| G | B |? ? ? | G | R |? ? ? ?| B | G |? ? ? ?| R | G |
? ? 在ISP處理模塊的第一部分,就是需要對CFA DATA進行去噪操作。普通的去噪方式針對Bayer數據格式是不合適的,需要進行變換后才能進行處理。
一、中值濾波CFA(Color Filter Array)Data去噪方法?
? ? 首先,讓我們一起來回顧一下中值濾波的算法原理以及優缺點,然后給出示意的算法效果圖。
? ? 中值濾波,顧名思義就是將濾波器里面所有像素值進行排序,然后用中間值替代當前像素點值。常用的中值濾波器有3X3,5X5等。
? ? 中值濾波的有點在于,實現簡單,能夠有效的消除椒鹽噪聲以及其他脈沖型噪聲。缺點也是所有去噪算法所共有的,就是平滑模糊了圖像的內容,有些角點以及邊緣的信息損失。
? ? 對CFA DATA進行去噪時,需要將不同的顏色通道分開進行處理,這樣是為了防止在平滑過程中將有用的顏色信息丟掉,比如說,由綠色信息包圍的藍色像素值與其相差很大時,此時就會被認為是噪聲被處理掉,然而真實情況是,該區域的藍色信息都是很大的。所以各通道單獨處理的話是有利于保護顏色信息的。在我的處理過程中,是將原CFA DATA分成4塊-R,G1,G2,B,分塊去噪完成后再重新恢復到原來的位置,這樣整個過程就完成了。
? ? 下面給出參考的中值濾波和主程序的C++(MFC)代碼:
主函數:
?
void?main()?? {?? ?? ????/*******開始編寫中值濾波去噪模塊--2015.07.27***********/?? ????//針對R分量塊進行去噪?? ????pNewDoc->m_RBlock??=?new?unsigned?short?[m_Height*m_Width/4];?? ????pNewDoc->m_G1Block?=?new?unsigned?short?[m_Height*m_Width/4];?? ????pNewDoc->m_G2Block?=?new?unsigned?short?[m_Height*m_Width/4];?? ????pNewDoc->m_BBlock??=?new?unsigned?short?[m_Height*m_Width/4];?? ?? ????unsigned?short*?smoothR??=?new?unsigned?short[m_Height*m_Width/4];?? ????unsigned?short*?smoothG1?=?new?unsigned?short[m_Height*m_Width/4];?? ????unsigned?short*?smoothG2?=?new?unsigned?short[m_Height*m_Width/4];?? ????unsigned?short*?smoothB??=?new?unsigned?short[m_Height*m_Width/4];?? ????for?(int?i?=?0;?i?<?m_Height/2?;i?++?)?? ????{?? ????????for(int?j?=?0;?j?<?m_Width/2?;?j?++?)?? ????????{?? ????????????pNewDoc->m_RBlock?[i*m_Width/2?+?j]?=?m_RawImage[i*m_Width*2?+?j*2];?? ????????????pNewDoc->m_G1Block[i*m_Width/2?+?j]?=?m_RawImage[i*m_Width*2?+?j*2?+?1];?? ????????????pNewDoc->m_G2Block[i*m_Width/2?+?j]?=?m_RawImage[i*m_Width*2?+?m_Width?+?j*2];?? ????????????pNewDoc->m_BBlock?[i*m_Width/2?+?j]?=?m_RawImage[i*m_Width*2?+?m_Width?+?j*2?+?1];?? ????????}?? ????}?? ????medianFilter(pNewDoc->m_RBlock,smoothR,m_Width/2,m_Height/2);???//針對R分量塊進行去噪?? ????medianFilter(pNewDoc->m_G1Block,smoothG1,m_Width/2,m_Height/2);?//針對G1分量塊進行去噪?? ????medianFilter(pNewDoc->m_G2Block,smoothG2,m_Width/2,m_Height/2);?//針對G2分量塊進行去噪?? ????medianFilter(pNewDoc->m_BBlock,smoothB,m_Width/2,m_Height/2);???//針對B分量塊進行去噪?? ?? ????//反過來構造去噪去噪后的raw?data?? ????for?(int?i?=?0;?i?<?m_Height/2?-?1;i?++?)?? ????{?? ????????for(int?j?=?0;?j?<?m_Width/2-1;?j?++?)?? ????????{?? ????????????pNewDoc->m_ImageNR[i*m_Width*2?+?j*2]?=?smoothR[i*m_Width/2?+?j];?? ????????????pNewDoc->m_ImageNR[i*m_Width*2?+?j*2?+?1]?=?smoothG1[i*m_Width/2?+?j];??? ????????????pNewDoc->m_ImageNR[i*m_Width*2?+?m_Width?+?j*2]?=?smoothG2[i*m_Width/2?+?j];?? ????????????pNewDoc->m_ImageNR[i*m_Width*2?+?m_Width?+?j*2?+?1]?=?smoothB[i*m_Width/2?+?j];?? ?? ????????}?? ????}?? ????/***********中值濾波模塊完成--2015.07.27********************/?? ????//SaveImageData(pNewDoc->m_ImageNR,?m_Height?,m_Width,"E:\\m_ImageNR.bmp");?? ????SetDisplayRawImage(?pNewDoc->m_ImageNR,?m_Height?,m_Width,?m_RawBitType,pNewDoc->m_Image);?? }??
void main()
{/*******開始編寫中值濾波去噪模塊--2015.07.27***********///針對R分量塊進行去噪pNewDoc->m_RBlock = new unsigned short [m_Height*m_Width/4];pNewDoc->m_G1Block = new unsigned short [m_Height*m_Width/4];pNewDoc->m_G2Block = new unsigned short [m_Height*m_Width/4];pNewDoc->m_BBlock = new unsigned short [m_Height*m_Width/4];unsigned short* smoothR = new unsigned short[m_Height*m_Width/4];unsigned short* smoothG1 = new unsigned short[m_Height*m_Width/4];unsigned short* smoothG2 = new unsigned short[m_Height*m_Width/4];unsigned short* smoothB = new unsigned short[m_Height*m_Width/4];for (int i = 0; i < m_Height/2 ;i ++ ){for(int j = 0; j < m_Width/2 ; j ++ ){pNewDoc->m_RBlock [i*m_Width/2 + j] = m_RawImage[i*m_Width*2 + j*2];pNewDoc->m_G1Block[i*m_Width/2 + j] = m_RawImage[i*m_Width*2 + j*2 + 1];pNewDoc->m_G2Block[i*m_Width/2 + j] = m_RawImage[i*m_Width*2 + m_Width + j*2];pNewDoc->m_BBlock [i*m_Width/2 + j] = m_RawImage[i*m_Width*2 + m_Width + j*2 + 1];}}medianFilter(pNewDoc->m_RBlock,smoothR,m_Width/2,m_Height/2); //針對R分量塊進行去噪medianFilter(pNewDoc->m_G1Block,smoothG1,m_Width/2,m_Height/2); //針對G1分量塊進行去噪medianFilter(pNewDoc->m_G2Block,smoothG2,m_Width/2,m_Height/2); //針對G2分量塊進行去噪medianFilter(pNewDoc->m_BBlock,smoothB,m_Width/2,m_Height/2); //針對B分量塊進行去噪//反過來構造去噪去噪后的raw datafor (int i = 0; i < m_Height/2 - 1;i ++ ){for(int j = 0; j < m_Width/2-1; j ++ ){pNewDoc->m_ImageNR[i*m_Width*2 + j*2] = smoothR[i*m_Width/2 + j];pNewDoc->m_ImageNR[i*m_Width*2 + j*2 + 1] = smoothG1[i*m_Width/2 + j]; pNewDoc->m_ImageNR[i*m_Width*2 + m_Width + j*2] = smoothG2[i*m_Width/2 + j];pNewDoc->m_ImageNR[i*m_Width*2 + m_Width + j*2 + 1] = smoothB[i*m_Width/2 + j];}}/***********中值濾波模塊完成--2015.07.27********************///SaveImageData(pNewDoc->m_ImageNR, m_Height ,m_Width,"E:\\m_ImageNR.bmp");SetDisplayRawImage( pNewDoc->m_ImageNR, m_Height ,m_Width, m_RawBitType,pNewDoc->m_Image);
}
?
void?medianFilter?(unsigned?short*?corrupted,?unsigned?short*?smooth,?int?width,?int?height)???? {???? ???????? ????memcpy?(?smooth,?corrupted,?width*height*sizeof(unsigned?short)?);???? ????for?(int?j=1;j<height-1;j++)???? ????{???? ????????for?(int?i=1;i<width-1;i++)???? ????????{???? ????????????int?k?=?0;???? ????????????unsigned?short?window[9];???? ????????????for?(int?jj?=?j?-?1;?jj?<?j?+?2;?++jj)???? ????????????????for?(int?ii?=?i?-?1;?ii?<?i?+?2;?++ii)???? ????????????????????window[k++]?=?corrupted[jj?*?width?+?ii];???? ????????????//???Order?elements?(only?half?of?them)???? ????????????for?(int?m?=?0;?m?<?5;?++m)???? ????????????{???? ????????????????int?min?=?m;???? ????????????????for?(int?n?=?m?+?1;?n?<?9;?++n)???? ????????????????????if?(window[n]?<?window[min])???? ????????????????????????min?=?n;???? ????????????????//???Put?found?minimum?element?in?its?place???? ????????????????unsigned?short?temp?=?window[m];???? ????????????????window[m]?=?window[min];???? ????????????????window[min]?=?temp;???? ????????????}?? ????????????smooth[?j*width+i?]?=?window[4];???? ????????}???? ????}???? }?
void medianFilter (unsigned short* corrupted, unsigned short* smooth, int width, int height)
{ memcpy ( smooth, corrupted, width*height*sizeof(unsigned short) ); for (int j=1;j<height-1;j++) { for (int i=1;i<width-1;i++) { int k = 0; unsigned short window[9]; for (int jj = j - 1; jj < j + 2; ++jj) for (int ii = i - 1; ii < i + 2; ++ii) window[k++] = corrupted[jj * width + ii]; // Order elements (only half of them) for (int m = 0; m < 5; ++m) { int min = m; for (int n = m + 1; n < 9; ++n) if (window[n] < window[min]) min = n; // Put found minimum element in its place unsigned short temp = window[m]; window[m] = window[min]; window[min] = temp; }smooth[ j*width+i ] = window[4]; } }
} <span style="font-family: Arial, Helvetica, sans-serif;"> </span>
中值濾波函數是在網上找的代碼,由于比較基礎,就直接拿過來用了,侵刪去噪前后效果圖:
?
? ? 下一篇文章,我將主要給大家展示一下BM3D算法RAW DATA去噪效果,謝謝。
?
?
ISP模塊之RAW DATA去噪(二)--BM3D算法
在正式開始本篇文章之前,讓我們一起回顧一下CFA圖像去噪的一些基本思路與方法。接著我會詳細地和大家分享自己學習理解的BM3D算法,操作過程,它的優缺點,最后會給出算法效果圖供參考。
在ISP模塊里,研究者們會討論去噪模塊(Noise Reduction)到底是在去馬賽克模塊(Demosaic)之前還是之后進行 。如果在之前處理的話,隨著去噪過程的進行,噪聲點消除的同時,伴隨著彩色信息的損失;如果在之后,復雜的插值過程將會改變噪聲的統計模型,使其變得很復雜并且難以計算。所以,更多的情況是選擇在Demosaic之前進行去噪操作。
CFA(Color Filter Array) Data不能采用傳統的灰度圖像去噪算法, 因為CFA圖像中相鄰的像素點具有不同的顏色信息度量,CFA圖像的塊狀結構與沒有傳統意義上的平滑性以及分段恒常性,以至于一般的去噪算法對CFA圖像并不適用。CFA Data也不能夠采用彩色圖像去噪算法因為每個像素點只含有一個顏色通道的信息。
①一種方法是,將原來的CFA圖像陣列分成四小塊(R,G1,G2,B),分別對這四塊采用灰度圖像去噪的方法。這種方法往往表現差,因為重要的色彩相關性信息被忽視掉了。CFA去噪算法可以通過利用CFA Data的空間以及色彩相關性來改善其效果。
②另外一種方法是利用CFA圖像里面各顏色塊的信息構造一幅低分辨率的RGB圖像,這種方式很好的利用了其顏色相關信息,但是不能夠較好的保護空間域上的高頻信息。
③BM3D(Block Matching 3-D filtering algorithm)算法的提出,通過限制圖像塊具有相同的顏色配置結構來達到處理CFA圖像的目的。
下面是BM3D算法的詳細介紹:
1.基礎估計
1).逐塊估計(Block-wise estimates)
分組(Grouping),找到所有與目前處理圖像塊相似的塊,把它們堆在一起形成一個3維的數組(分組)。
聯合硬閾值(Collaborative Hard-Thresholding).對已經組織好的分組進行3D變換,通過硬閾值3D變換系數達到減弱噪聲的目的,然后通過3D反變換回去得到分組內圖像塊的去噪后估計,并返回到它們之前所在的位置。
2).聚集(Aggregation) 對所估計圖像塊重復遮蓋的像素點進行加權平均,得到最終的像素值,也就是最后的基礎估計結果。
2.最終估計
1).逐塊估計(Block-wise estimates)
分組(Grouping),使用圖像塊匹配的方法,找到原噪聲圖像以及基礎估計圖像里面與目前處理圖像塊相似的所有塊,形成兩個3維數組(分組)。
聯合維納濾波(Collaborative wiener-filtering).對已經組織好的兩個分組進行3D變換,將基礎估計圖像的能量頻譜作為真實的能量頻譜對噪聲圖像分組進行維納濾波,然后通過3D反變換回去得到所有分組的圖像塊估計,并返回到它們之前所在的位置。
2).聚集(Aggregation)
對所有得到的估計圖像塊重復遮蓋的像素點進行加權平均,得到最終的像素值,也就是最后的最終估計結果。
BM3D如何找到相似圖像塊組織3D分組:如下圖所示,正方形所示為各個圖像塊,左上的分組所選取的圖像塊都具有角點(尖點)特征,其他分組類似。
BM3D如何在CFA中進行處理:如下圖所示,左邊的分組里面的圖像塊具有不同的彩色配置,即R,G,B的排列方式不是一致的,而右邊具有相同的彩色配置,所以其對于處理CFA圖像是非常合理的。
上面將BM3D的算法原理以及細節操作都跟大家介紹清楚了,下面就來看一下BM3D對于CFA圖像的算法效果:
原噪聲圖像
中值濾波圖像
BM3D去噪圖像
算法效果(PSNR)明顯優于中值濾波,去噪模塊就此結束,下一篇開始給大家介紹兩種色彩增強的算法。
BM3D網上有現成的Matlab代碼,算法鏈接網址:http://www.cs.tut.fi/~foi/GCF-BM3D/
參考文獻:
1).A case for denoising before demosaicking color fiter array data,Sung Hee Park etc.
2).A Framework for wavelet-based analysis and processing of color filter array images with applications to denoising and demosaicing,Hirakawa etc.Havard University.
3).Cross-color BM3D Filtering of Noise Raw Data,Aram Danielyan etc.
?
ISP模塊之彩色圖像增強--ACE算法 .
? ACE(Automatic Color Enhancement),自動色彩增強算法, 是一種對于彩色圖像增強十分行之有效的方法。它的改進算法以及快速實現在文章Automatic Color Enhancement (ACE) and its Fast Implementation,2012中提出。
? ??在NxN的圖像上,ACE算法的算法復雜度為O(N^4),文章提出的新的ACE算法采取了兩種近似的方法,一是采用多項式函數逼近坡度函數(Slope function)降低卷積計算量,二是采用不同程度的插值來降低卷積的計算量。
? ? ACE算法具體步驟:
? ? 第一步:分別對彩色圖像的R,G,B通道進行單獨處理,計算每個像素點的R(x)值,其中Sa(t)為坡度函數,表示如下,第一步適應局部圖像對比,Sa(t)能夠放大較小的差異,并且豐富大的差異,能夠根據局部內容來擴展或者壓縮動態范圍:
? ? ? ? ? ??
? ? ? ? ??
? ? 第二步:利用下面的公式將R(x)展到[0,1]之間,得到增強后的通道,第二步獲得全局白平衡。
? ??
? ? 第三步:求解最優化問題,ACE算法可以看做是對規范的直方圖均衡化方法的一種平滑和局部修正的方法。
? ??
? ? 改進方法所考慮的一些因素:
? ? 1)其他的坡度函數Sa(t),多項式函數逼近
? ??
? ? 2)除了1/||x-y||外的權重函數的選擇
? ? 3)在求和的過程中,y可以限制在x周圍的一個小窗口中
? ? 4)L(x)的一些其他的標準化方法
? ? 實驗效果:在官網上下載源代碼,安裝FFTW3庫之后方能正常運行得到結果。該方法對于對比度低,或者有霧的圖像處理后效果明顯。
源代碼鏈接網址:http://www.ipol.im/pub/art/2012/g-ace/
FFTW3庫下載以及配置鏈接:http://bbs.csdn.net/topics/390815673
?命令行:AutoColorEnhancement -a 5 -w 1/r -m interp:12 input.bmp output.bmp
? ? ? ? ? ? ? ? 原圖?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ACE處理后
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 原圖
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ACE處理后
?
ISP模塊之色彩增強算法--HSV空間Saturation通道調整 .
?色彩增強 不同于彩色圖像增強,圖像增強的一般處理方式為直方圖均衡化等,目的是為了增強圖像局部以及整體對比度。而色彩增強的目的是為了使的原有的不飽和的色彩信息變得飽和、豐富起來。對應于Photoshop里面的“色相/飽和度”調節選項里面對飽和度 的操作。色彩增強的過程,并不改變原有彩色圖像的顏色以及亮度信息。
? ? 在我的色彩增強算法模塊里面,始終只針對色彩飽和度(Saturation)信息做研究,調整。這樣的話,那就不得不介紹HSV顏色空間了,H代表Hue(色彩),S代表Saturation(飽和度),V代表Value,也可用B表示(Brightness,明度),HSV空間也可稱作HSB空間。
? ? HSV空間在wikipedia上的介紹,https://en.wikipedia.org/wiki/HSL_and_HSV?
? ? 下面根據自己的理解介紹一下HSV空間,以及其各通道在Matlab和OpenCV中的不同。
? ? HSV的圓柱模型
? ??
? ? HSV的圓錐模型
? ??
? ? 從上圖可以看出,在HSV空間中,Hue通道的取值從0-360°變化時,顏色從紅->黃->綠->青->藍 逐步變化。Saturation從0->1變化時,色彩逐漸加深變成純色(pure) 。Value值從0->1變化時,圖像整體亮度增加,V值為0時,圖像為全黑 ,V值為1時,圖像為全白 。
? ? Matlab RGB色彩空間向HSV轉換,采用函數rgb2hsv,轉換后的hsv各通道的元素取值范圍為[0,1];OpenCV中彩色圖像向HSV空間中轉換,cvtColor(src,srcHsv,CV_BGR2HSV),轉換后H的取值范圍為[0,180],S,V的取值范圍為[0,255].
? ?下面介紹自己的算法處理思路,后面會給出完整的Matlab代碼:?
? ?步驟一、給出一張原圖src,用PS進行飽和度(Saturation)+40處理后另存為src_40;
? ?步驟二、將以上兩張圖像分別轉換到hsv空間,提取出飽和度信息,分別為S,S_40;
? ?步驟三、統計飽和度增加40后,原色彩飽和度與飽和度增量之間的對應關系,即S -- (S_40-S);
? ?步驟四、對關系S -- (S_40-S)進行二次多項式曲線擬合,得到二次曲線f(x) = p1*x^2 + p2*x + p3;
? ?為什么是二次?1.對應關系呈現出拋物線形狀;2.更高次曲線并沒有明顯改善擬合性能,且計算消耗會變高。
? ?步驟五、任意給定輸出圖像input,根據其色彩飽和度信息,即可進行色彩增強40處理,新的飽和度信息可以表示為S'(x) = S(x) + f(x),得到增強后的色彩信息后返回RGB圖像輸出;
? ?步驟六、分別對原圖+20,+40,+60后進行飽和度信息統計,并得到相應擬合參數,設置為色彩增強的低、中、高三擋,在實際處理過程中,根據輸入圖像input自身色彩飽和度信息(均值)自適應選取相應參數進行色彩增強;
? ?步驟七、按需對某一單獨顏色通道進行色彩增強處理,例如綠色范圍為105°-135°,在對該范圍進行增強的同時,還需對75°-105°,135°-165°進行一半強度的增強,這樣才會保證色彩的連續性,不會出現色斑;
? ?步驟八、按需對色彩(Hue)進行轉換;
? ?代碼部分:第一部分用作估計擬合參數,在Curve fitting tool 里面對X,Y進行擬合,得到曲線參數。
%?Color?Enhancement?? clc,clear,close?all?? src1?=?imread('src.bmp');?? src2?=?imread('src_40.bmp');?? ?? src1_hsv?=?rgb2hsv(src1);?? src2_hsv?=?rgb2hsv(src2);?? ?? h1?=?src1_hsv(:,:,1);?? s1?=?src1_hsv(:,:,2);?? v1?=?src1_hsv(:,:,3);?? ?? h2?=?src2_hsv(:,:,1);?? s2?=?src2_hsv(:,:,2);?? v2?=?src2_hsv(:,:,3);?? %??? meanS1?=?mean(s1(:));?? varS1??=?std2(s1);??? %??? meanS2?=?mean(s2(:));?? varS2??=?std2(s2);??? %??? deltaS?=?s2?-?s1;?? deltaV?=?v2?-?v1;?? ?? %%?test1?:?觀測“原飽和度-飽和度調整增量”的關系?saturation?and?delta?saturation?? figure;?? oriS?=?zeros(101,2);?? s3?=?s1;?? j?=?1;?? for?i?=?0:?0.01?:?1?? ????oriS(j,1)?=?i?+?0.01;?? ????oriS(j,2)?=??mean(deltaS(find(s1?>?i?&?s1<?i?+?0.01)));?? ????j?=?j?+?1;?? end?? X??=?oriS(:,1);?? Y??=?oriS(:,2);?? XX?=?oriS(:,1)?*?255;?? YY?=?oriS(:,2)?*?255;?? plot(XX,YY)??
% Color Enhancement
clc,clear,close all
src1 = imread('src.bmp');
src2 = imread('src_40.bmp');src1_hsv = rgb2hsv(src1);
src2_hsv = rgb2hsv(src2);h1 = src1_hsv(:,:,1);
s1 = src1_hsv(:,:,2);
v1 = src1_hsv(:,:,3);h2 = src2_hsv(:,:,1);
s2 = src2_hsv(:,:,2);
v2 = src2_hsv(:,:,3);
%
meanS1 = mean(s1(:));
varS1 = std2(s1);
%
meanS2 = mean(s2(:));
varS2 = std2(s2);
%
deltaS = s2 - s1;
deltaV = v2 - v1;%% test1 : 觀測“原飽和度-飽和度調整增量”的關系 saturation and delta saturation
figure;
oriS = zeros(101,2);
s3 = s1;
j = 1;
for i = 0: 0.01 : 1oriS(j,1) = i + 0.01;oriS(j,2) = mean(deltaS(find(s1 > i & s1< i + 0.01)));j = j + 1;
end
X = oriS(:,1);
Y = oriS(:,2);
XX = oriS(:,1) * 255;
YY = oriS(:,2) * 255;
plot(XX,YY)
?
? ?第二部分,對輸入圖像進行高、中、低三級自適應增強處理
%%?Color?Enhancement?Module?--?Authored?by?HuangDao,08/17/2015?? %?functions:?input?a?image?of?type?BMP?or?PNG,?the?program?will?decide?to?? %?do?the?Color?Enhancement?choice?for?you.There?are?four?types?of?Enhanced?? %?intensity?-?20,40,60,80.The?larger?number?stands?for?stronger?? %?enhancement.?? %?And?we?can?also?choose?the?simple?color?channel(eg.R,G,B)?to?do?the?? %?enhancement.There?are?also?four?different?types?of?enhanced?intensity.?? %?? %?parameters?table?? %??------------------------------------------------------------------------?? %?|?Enhanced??|?????MATLAB?params?????????????|??????OpenCV?params?????????|?? %?|?intensity?|p1????????p2????????p3?????????|?p1????????p2????????p3?????|?? %?|?20????????|-0.1661???0.2639????-0.003626??|-0.0006512?0.2639????-0.9246|?? %?|?40????????|-0.4025???0.6238????-0.0005937?|0.001578???0.6238????-0.1514|?? %?|?60????????|1.332?????1.473?????-0.01155???|-0.005222??1.473?????-2.946?|?? %?|?80????????|-4.813????3.459?????-0.004568??|-0.01887???3.459?????-1.165?|?? %??------------------------------------------------------------------------?? ?? clc;?clear?;close?all?? %?載入文件夾?? pathName?=?'.\';?? fileType?=?'*.bmp';?? files????=?dir([pathName?fileType]);?? len??????=?length(files);?? ?? for?pic?=?5%1:1:len?? ????srcName?=?files(pic).name;?? ????srcImg??=?imread(srcName);?? ????srcHSV??=?rgb2hsv(srcImg);?? ????srcH????=?srcHSV(:,:,1);?? ????srcS????=?srcHSV(:,:,2);?? ????srcV????=?srcHSV(:,:,3);?? ????meanS???=?mean(srcS(:));?? ????varS????=?std2(srcS);?? ????%圖像整體進行色彩增強處理?? ????if?(meanS?>=?0.5)?? ????????p1?=?0;p2?=?0;p3?=?0;?? ????else?if?(meanS?>=?0.35?&&?meanS?<?0.5)?? ????????????p1?=?-0.1661;p2?=?0.2639;p3?=?-0.003626;?? ????????else?if?(meanS?>=0.2?&&?meanS?<0.35)?? ????????????????p1?=?-0.4025;p2?=?0.6238;p3?=?-0.0005937;?? ????????????else?? ????????????????p1?=?1.332;p2?=?1.473;p3?=?-0.01155;?? ????????????end?? ????????end?? ????end?? ????dstS?=?srcS?+?p1*srcS.*srcS?+?p2*srcS?+?p3?;?? ????dstHSV?=?srcHSV;?? ????dstHSV(:,:,2)?=?dstS;?? ????dstImg?=?hsv2rgb(dstHSV);?? ????figure;imshow(srcImg);?? ????figure;imshow(dstImg);?? ????%指定R,G,B通道進行色彩增強處理,紅色范圍([225-255]),綠色范圍(75-[105-135]-165),藍色范圍([-15-15])?? ????p11?=?-0.4025;p21?=?0.6238;p31?=?-0.0005937;%周邊雜色調整系數,40?? ????p12?=?1.332;??p22?=?1.473;?p32?=?-0.01155;??%純色區域調整系數,60?? ????compHue?=?srcH;?? ????GcompS??=?dstS;?? ????RcompS??=?dstS;?? ????BcompS??=?dstS;?? ????channel?=?'B';?? ????switch?channel?? ????????case?'G'?? ????????????I1?=?find(compHue?>?0.2083?&?compHue?<0.2917);?? ????????????GcompS(I1)?=?dstS(I1)?+?dstS(I1).*dstS(I1)*p11?+?dstS(I1)*p21?+?p31;?? ????????????I2?=?find(compHue?>=?0.2917?&?compHue?<=?0.3750);?? ????????????GcompS(I2)?=?dstS(I2)?+?dstS(I2).*dstS(I2)*p12?+?dstS(I2)*p22?+?p32;?? ????????????I3?=?find(compHue?>?0.3750?&?compHue?<0.4583);?? ????????????GcompS(I3)?=?dstS(I3)?+?dstS(I3).*dstS(I3)*p11?+?dstS(I3)*p21?+?p31;?? ????????????compHSV?=?dstHSV;?? ????????????compHSV(:,:,2)?=?GcompS;?? ????????????dstImgG?=?hsv2rgb(compHSV);?? ????????????figure;imshow(dstImgG);?? ????????case?'R'?? ????????????I1?=?find(compHue?>?0.875?&?compHue?<0.9583);?? ????????????RcompS(I1)?=?dstS(I1)?+?dstS(I1).*dstS(I1)*p11?+?dstS(I1)*p21?+?p31;?? ????????????I2?=?find(compHue?>=?0.9583?|?compHue?<=?0.0417);?? ????????????RcompS(I2)?=?dstS(I2)?+?dstS(I2).*dstS(I2)*p12?+?dstS(I2)*p22?+?p32;?? ????????????I3?=?find(compHue?>?0.0417?&?compHue?<0.125);?? ????????????RcompS(I3)?=?dstS(I3)?+?dstS(I3).*dstS(I3)*p11?+?dstS(I3)*p21?+?p31;?? ????????????compHSV?=?dstHSV;?? ????????????compHSV(:,:,2)?=?RcompS;?? ????????????dstImgR?=?hsv2rgb(compHSV);?? ????????????figure;imshow(dstImgR);?? ????????case?'B'?? ????????????I1?=?find(compHue?>?0.5417?&?compHue?<0.625);?? ????????????BcompS(I1)?=?dstS(I1)?+?dstS(I1).*dstS(I1)*p11?+?dstS(I1)*p21?+?p31;?? ????????????I2?=?find(compHue?>=?0.625?&?compHue?<=?0.7083);?? ????????????BcompS(I2)?=?dstS(I2)?+?dstS(I2).*dstS(I2)*p12?+?dstS(I2)*p22?+?p32;?? ????????????I3?=?find(compHue?>?0.7083?&?compHue?<0.7917);?? ????????????BcompS(I3)?=?dstS(I3)?+?dstS(I3).*dstS(I3)*p11?+?dstS(I3)*p21?+?p31;?? ????????????compHSV?=?dstHSV;?? ????????????compHSV(:,:,2)?=?BcompS;?? ????????????dstImgB?=?hsv2rgb(compHSV);?? ????????????figure;imshow(dstImgB);?? ????end?? ????%進行R,G,B通道之間的互換?? ????convH?=?zeros(size(srcH,1),size(srcH,2));?%convert?? ????deltaHue?=?240;?? ????switch?deltaHue?? ????????case?120?? ????????????disp('R?->?G')?? ????????????convH?=?srcH?+?1/3;?? ????????????convH(find(convH?>=?1))?=?convH(find(convH?>=?1))?-?1;?? ????????case?240?? ????????????disp('R?->?B')?? ????????????convH?=?srcH?+?2/3;?? ????????????convH(find(convH?>=?1))?=?convH(find(convH?>=?1))?-?1;?? ????end?? ????convHSV?=?dstHSV;?? ????convHSV(:,:,1)?=?convH;?? ????convImg?=?hsv2rgb(convHSV);?? ????figure;imshow(convImg)?? ????pause();?? end??
%% Color Enhancement Module -- Authored by HuangDao,08/17/2015
% functions: input a image of type BMP or PNG, the program will decide to
% do the Color Enhancement choice for you.There are four types of Enhanced
% intensity - 20,40,60,80.The larger number stands for stronger
% enhancement.
% And we can also choose the simple color channel(eg.R,G,B) to do the
% enhancement.There are also four different types of enhanced intensity.
%
% parameters table
% ------------------------------------------------------------------------
% | Enhanced | MATLAB params | OpenCV params |
% | intensity |p1 p2 p3 | p1 p2 p3 |
% | 20 |-0.1661 0.2639 -0.003626 |-0.0006512 0.2639 -0.9246|
% | 40 |-0.4025 0.6238 -0.0005937 |0.001578 0.6238 -0.1514|
% | 60 |1.332 1.473 -0.01155 |-0.005222 1.473 -2.946 |
% | 80 |-4.813 3.459 -0.004568 |-0.01887 3.459 -1.165 |
% ------------------------------------------------------------------------clc; clear ;close all
% 載入文件夾
pathName = '.\';
fileType = '*.bmp';
files = dir([pathName fileType]);
len = length(files);for pic = 5%1:1:lensrcName = files(pic).name;srcImg = imread(srcName);srcHSV = rgb2hsv(srcImg);srcH = srcHSV(:,:,1);srcS = srcHSV(:,:,2);srcV = srcHSV(:,:,3);meanS = mean(srcS(:));varS = std2(srcS);%圖像整體進行色彩增強處理if (meanS >= 0.5)p1 = 0;p2 = 0;p3 = 0;else if (meanS >= 0.35 && meanS < 0.5)p1 = -0.1661;p2 = 0.2639;p3 = -0.003626;else if (meanS >=0.2 && meanS <0.35)p1 = -0.4025;p2 = 0.6238;p3 = -0.0005937;elsep1 = 1.332;p2 = 1.473;p3 = -0.01155;endendenddstS = srcS + p1*srcS.*srcS + p2*srcS + p3 ;dstHSV = srcHSV;dstHSV(:,:,2) = dstS;dstImg = hsv2rgb(dstHSV);figure;imshow(srcImg);figure;imshow(dstImg);%指定R,G,B通道進行色彩增強處理,紅色范圍([225-255]),綠色范圍(75-[105-135]-165),藍色范圍([-15-15])p11 = -0.4025;p21 = 0.6238;p31 = -0.0005937;%周邊雜色調整系數,40p12 = 1.332; p22 = 1.473; p32 = -0.01155; %純色區域調整系數,60compHue = srcH;GcompS = dstS;RcompS = dstS;BcompS = dstS;channel = 'B';switch channelcase 'G'I1 = find(compHue > 0.2083 & compHue <0.2917);GcompS(I1) = dstS(I1) + dstS(I1).*dstS(I1)*p11 + dstS(I1)*p21 + p31;I2 = find(compHue >= 0.2917 & compHue <= 0.3750);GcompS(I2) = dstS(I2) + dstS(I2).*dstS(I2)*p12 + dstS(I2)*p22 + p32;I3 = find(compHue > 0.3750 & compHue <0.4583);GcompS(I3) = dstS(I3) + dstS(I3).*dstS(I3)*p11 + dstS(I3)*p21 + p31;compHSV = dstHSV;compHSV(:,:,2) = GcompS;dstImgG = hsv2rgb(compHSV);figure;imshow(dstImgG);case 'R'I1 = find(compHue > 0.875 & compHue <0.9583);RcompS(I1) = dstS(I1) + dstS(I1).*dstS(I1)*p11 + dstS(I1)*p21 + p31;I2 = find(compHue >= 0.9583 | compHue <= 0.0417);RcompS(I2) = dstS(I2) + dstS(I2).*dstS(I2)*p12 + dstS(I2)*p22 + p32;I3 = find(compHue > 0.0417 & compHue <0.125);RcompS(I3) = dstS(I3) + dstS(I3).*dstS(I3)*p11 + dstS(I3)*p21 + p31;compHSV = dstHSV;compHSV(:,:,2) = RcompS;dstImgR = hsv2rgb(compHSV);figure;imshow(dstImgR);case 'B'I1 = find(compHue > 0.5417 & compHue <0.625);BcompS(I1) = dstS(I1) + dstS(I1).*dstS(I1)*p11 + dstS(I1)*p21 + p31;I2 = find(compHue >= 0.625 & compHue <= 0.7083);BcompS(I2) = dstS(I2) + dstS(I2).*dstS(I2)*p12 + dstS(I2)*p22 + p32;I3 = find(compHue > 0.7083 & compHue <0.7917);BcompS(I3) = dstS(I3) + dstS(I3).*dstS(I3)*p11 + dstS(I3)*p21 + p31;compHSV = dstHSV;compHSV(:,:,2) = BcompS;dstImgB = hsv2rgb(compHSV);figure;imshow(dstImgB);end%進行R,G,B通道之間的互換convH = zeros(size(srcH,1),size(srcH,2)); %convertdeltaHue = 240;switch deltaHuecase 120disp('R -> G')convH = srcH + 1/3;convH(find(convH >= 1)) = convH(find(convH >= 1)) - 1;case 240disp('R -> B')convH = srcH + 2/3;convH(find(convH >= 1)) = convH(find(convH >= 1)) - 1;endconvHSV = dstHSV;convHSV(:,:,1) = convH;convImg = hsv2rgb(convHSV);figure;imshow(convImg)pause();
end
?
? ?添加OpenCV代碼段:
Mat?srcHSV,sat,satAdj,dstMerge,dst;?????//sat?-?saturation飽和度分量?? Mat?imageAwb?=?imread("m_ImageAwb.bmp");?? vector<Mat>?channels,channels1;?? double?p1,p2,p3;?? ?? cvtColor(imageAwb,srcHSV,CV_BGR2HSV);?? split(srcHSV,channels);?? split(srcHSV,channels1);?? sat?=?channels.at(1);?? Scalar?m?=?mean(sat);?? ?? if?(m(0)?<=?51.5)????????????????????????? {p1?=?-0.002714?,?p2?=?0.9498,?p3?=?-0.5073;??AfxMessageBox("High?Color?Enhancement!");?}//高?? else?if?(m(0)?>?38.5?&&?m(0)?<=?89.5)???? {p1?=?-0.001578??,?p2?=?0.6238,?p3?=?-0.1514;AfxMessageBox("Middle?Color?Enhancement!");?}//中?? else?if?(m(0)?>?89.5?&&?m(0)?<=127.5)???? {p1?=?-0.0006512,?p2?=?0.2639,?p3?=?-0.9246;AfxMessageBox("Low?Color?Enhancement!");}//低?? else????????????????????????????????????? {p1?=?0,p2?=?0,p3?=0;AfxMessageBox("No?Color?Enhancement!");}?? ?? satAdj?=?sat;?? for?(int?i?=?0?;?i?<?sat.rows;i?++)?? {?? ????for?(int?j?=?0;j?<?sat.cols;j?++)?? ????{?? ????????uchar?val?=?sat.at<uchar>(i,j);?? ????????satAdj.at<uchar>(i,j)?=?(val?+?p1?*?val?*?val?+?p2?*?val?+?p3)?;?? ????}?? }?? ?? channels1.at(1)?=?satAdj;?? merge(channels1,dstMerge);?? cvtColor(dstMerge,dst,CV_HSV2BGR);?? imwrite("m_ImageCE.bmp",dst);??
Mat srcHSV,sat,satAdj,dstMerge,dst; //sat - saturation飽和度分量Mat imageAwb = imread("m_ImageAwb.bmp");vector<Mat> channels,channels1;double p1,p2,p3;cvtColor(imageAwb,srcHSV,CV_BGR2HSV);split(srcHSV,channels);split(srcHSV,channels1);sat = channels.at(1);Scalar m = mean(sat);if (m(0) <= 51.5) {p1 = -0.002714 , p2 = 0.9498, p3 = -0.5073; AfxMessageBox("High Color Enhancement!"); }//高else if (m(0) > 38.5 && m(0) <= 89.5) {p1 = -0.001578 , p2 = 0.6238, p3 = -0.1514;AfxMessageBox("Middle Color Enhancement!"); }//中else if (m(0) > 89.5 && m(0) <=127.5) {p1 = -0.0006512, p2 = 0.2639, p3 = -0.9246;AfxMessageBox("Low Color Enhancement!");}//低else {p1 = 0,p2 = 0,p3 =0;AfxMessageBox("No Color Enhancement!");}satAdj = sat;for (int i = 0 ; i < sat.rows;i ++){for (int j = 0;j < sat.cols;j ++){uchar val = sat.at<uchar>(i,j);satAdj.at<uchar>(i,j) = (val + p1 * val * val + p2 * val + p3) ;}}channels1.at(1) = satAdj;merge(channels1,dstMerge);cvtColor(dstMerge,dst,CV_HSV2BGR);imwrite("m_ImageCE.bmp",dst);
?
? ?最后給出算法效果圖:
Group1.原圖->增強后
?
Group2.原圖->R通道增強->顏色通道改變R2B
Group3.原圖->增強后->顏色通道改變R2B
完!下篇講Local Tone Mapping。
?
直方圖均衡(HE)與局部色調映射(LTM) .
直方圖均衡(Histogram Equalization)是圖像處理中一個十分基礎的概念,具有調整圖像灰度,增強對比度的作用。
? ?限制對比度自適應直方圖均衡( Contrast Limited Adaptive Histogram Equalization,CLAHE), 關于該算法的中文原理性描述可以參考網址:http://www.cnblogs.com/Imageshop/archive/2013/04/07/3006334.html?
? ?下面我按照自己的理解來介紹一下CLAHE算法:
? ?自適應直方圖均衡(AHE)算法 ,對于圖像中存在明顯比其他區域亮或者暗的地方時,普通的直方圖均衡算法就不能將該處的細節信息描述出來。AHE算法通過在當前處理像素周邊的一個矩形區域內進行直方圖均衡,來達到擴大局部對比度,顯示平滑區域細節的作用。
? ?AHE算法的2個屬性:1、AHE算法處理的局部領域,矩形領域小,局部對比度強,矩形領域大,局部對比度弱。2、如果矩形區域內的圖像塊信息比較平坦,灰度接近,其灰度直方圖呈尖狀,在直方圖均衡的過程中就可能會出現過度放大噪聲的情況。
? ?CLAHE,對比度受限的自適應直方圖均衡 算法就能夠有效的限制噪聲放大的情形。下圖表示的就是局部矩形領域內的灰度直方圖,由于對比度放大的程度與像素點的概率分布直方圖的曲線斜度成比例,所以為了限制對比度,將大于一定閾值的部分平均分配到直方圖的其他地方,如右圖所示,這樣的話,通過限制CDF(累積分布函數)的斜率來一定程度限制對比度。
? ?
? ?插值過程 ,得到了CDF函數,也就獲得了對應的亮度變換函數,在計算變換函數的時候可以通過插值過程來降低計算量。其中紅色塊(圖像角點處)的變換函數是完全按照定義獲得的,綠色塊(圖像邊緣)的變換函數是通過旁邊兩個圖像塊的變換函數線性插值得到的,藍色部分圖像塊的變換函數則是通過雙線性插值得到。
? ?
? ?目前,Matlab和OpenCV中都已經集成了CLAHE函數,在Matlab中,就是函數J = adapthisteq(I);
? ?在OpenCV中,按照如下代碼段處理:
Ptr<CLAHE>?clahe?=?createCLAHE();??? clahe?->apply(src,dst);??
Ptr<CLAHE> clahe = createCLAHE();
clahe ->apply(src,dst);
? ?局部色調映射(Local Tone Mapping)
? ?重建視覺外觀是色調映射的終極目標。色調映射算法在降低高動態圖像(HDR)范圍的同時著力保護捕捉到的原始圖像的外觀。色調映射算子分兩種策略,一種是全局的,另一種是局部的。
? ?全局映射算子
? ?每一個像素點將會根據它的全圖特征和亮度信息進行映射,不管其空間位置幾何。全局算子一個比較典型的例子就是色調曲線。全局色調映射在處理12位(12-bit)深度的圖像的時候是完全OK的,當圖像的動態范圍特別高的時候,那就不行了。這是因為所有的像素點都采取同一種方式進行處理,根本就沒有管它是在較亮區域還是較暗區域。這樣的話,就是導致圖像色調映射過后看起來很平坦,失去了其局部的細節信息。
? ?局部映射算子 ?? ?像素點所在的空間位置會被考慮,在進行尺度變換的時候,所以,具有相同亮度值的兩個像素點會被映射成不同的值,因為它們的空間位置周邊的亮度信息可能不一樣。局部色調映射需要考慮到每個像素點周圍的亮度信息,這樣這會使得計算量和內存的使用會更大,但是會有更好的結果。如果處理得當,局部色調映射會很好的保護高亮和陰影部分的局部對比度和細節信息。
? ?目前的一些色調映射算法:
? ?1、伽馬壓縮算法
? ?2、基于直方圖均衡的壓縮算法
? ?3、基于Retinex的算法
? ?4、基于梯度的壓縮算法,等等
? ?下面給出2組基于CLAHE的LTP算法 效果圖:(測試圖像在網上找的)
? ?Matlab代碼如下:
%%?local?tone?mapping?? clc,clear?,close?all?? %?src?=?imread('m_ImageDemosaic.bmp');?? src?=?imread('C:\Users\Administrator\Desktop\LTP5.png');?? figure;imshow(src);?? srcHDR?=?double(src)?*?256;?? hsv?=?rgb2hsv(srcHDR);?? figure;imshow(uint16(srcHDR))?? J?=?adapthisteq(uint16(hsv(:,:,3)));?? hsv(:,:,3)?=?double(J);?? dstHDR?=?hsv2rgb(hsv);?? figure;imshow(uint16(dstHDR))?? imwrite(uint16(dstHDR),'C:\Users\Administrator\Desktop\LTP5_1.png')??
%% local tone mapping
clc,clear ,close all
% src = imread('m_ImageDemosaic.bmp');
src = imread('C:\Users\Administrator\Desktop\LTP5.png');
figure;imshow(src);
srcHDR = double(src) * 256;
hsv = rgb2hsv(srcHDR);
figure;imshow(uint16(srcHDR))
J = adapthisteq(uint16(hsv(:,:,3)));
hsv(:,:,3) = double(J);
dstHDR = hsv2rgb(hsv);
figure;imshow(uint16(dstHDR))
imwrite(uint16(dstHDR),'C:\Users\Administrator\Desktop\LTP5_1.png')
? ?由于獲取不到源HDR,所以自己先將8-bit圖像映射到16-bit之后再進行試驗
? ?測試圖像來源鏈接:http://www.vista123.com/vista/9226.html;http://www.nipic.com/show/7139458.html
?
什么是ISP,他的工作原理是怎樣的?
ISP是Image Signal Processor的縮寫,全稱是影像處理器。在相機成像的整個環節中,它負責接收感光元件(Sensor)的原始信號數據,可以理解為整個相機拍照、錄像的第一步處理流程,對圖像質量起著非常重要的作用。
?
高通8974 拍照顯示流程,可以清晰的看出ISP在整個流程中的位置
ISP的功能比較雜,基本上跟圖像效果有關的它都有份。它內部包含多個圖像算法處理模塊,其中比較有代表性的是:
扣暗電流(去掉底電流噪聲),線性化(解決數據非線性問題),shading(解決鏡頭帶來的亮度衰減與顏色變化),去壞點(去掉sensor中壞點數據),去噪(去除噪聲),demosaic(raw數據轉為RGB數據),3A(自動白平衡,自動對焦,自動曝光),gamma(亮度映射曲線,優化局部與整體對比度),旋轉(角度變化),銳化(調整銳度),縮放(放大縮小),色彩空間轉換(轉換到不同色彩空間進處理),顏色增強(可選,調整顏色),膚色增強(可選,優化膚色表現)等 。
實際情況下,不同芯片的ISP,其處理流程和模塊可能會稍有不同,但是其原理、實現功能都是一樣的。
ISP基礎一
1、專業術語
【ColorTemp】 色溫
? ? ? ? 所謂色溫,簡而言之,就是定量地以開爾文溫度(K)來表示色彩。英國著名物理學家開爾文認為,假定某一黑體物質,能夠將落在其上的所有熱量吸收,而沒有損失,同時又能夠將熱量生成的能量全部以“光”的形式釋放出來的話,它便會因受到熱力的高低而變成不同的顏色。例如,當黑體受到的熱力相當于500—550℃時,就會變成暗紅色,達到1050-1150℃時,就變成黃色,溫度繼續升高會呈現藍色。光源的顏色成分與該黑體所受的熱力溫度是相對應的,任何光線的色溫是相當于上述黑體散發出同樣顏色時所受到的“溫度”,這個溫度就用來表示某種色光的特性以區別其它,這就是色溫。打鐵過程中,黑色的鐵在爐溫中逐漸變成紅色,這便是黑體理論的最好例子。色溫現象在日常生活中非常普遍,相信人們對它并不陌生。鎢絲燈所發出的光由于色溫較低表現為黃色調,不同的路燈也會發出不同顏色的光,天然氣的火焰是藍色的,原因是色溫較高。正午陽光直射下的色溫約為5600 K,陰天更接近室內色溫3200K。日出或日落時的色溫約為2000K,燭光的色溫約為1000K。
【備注】
黑體的定義:
⑴在任何溫度下,完全吸收任何波長的外來輻射而無任何反射的物體。
⑵吸收比為1的物體。
⑶在任何溫度下,對入射的任何波長的輻射全部吸收的物體。
黑體,是一個理想化了的物體,它能夠吸收外來的全部電磁輻射,并且不會有任何的反射與透射。換句話說,黑體對于任何波長的電磁波的吸收系數為1,透射系數為0。但黑體不見得就是黑色的,即使它沒辦法反射任何的電磁波,它也可以放出電磁波來,而這些電磁波的波長和能量則全取決于黑體的溫度,不因其他因素而改變。當然,黑體在700K以下時看起來是黑色的,但那也只是因為在700K之下的黑體所放出來的輻射能量很小且輻射波長在可見光范圍之外。若黑體的溫度高過上述的溫度的話,黑體則不會再是黑色的了,它會開始變成紅色,并且隨著溫度的升高,而分別有橘色、黃色、白色等顏色出現,即黑體吸收和放出電磁波的過程遵循了光譜,其軌跡為普朗克軌跡(或稱為黑體軌跡)。黑體輻射實際上是黑體的熱輻射。在黑體的光譜中,由于高溫引起高頻率即短波長,因此較高溫度的黑體靠近光譜結尾的藍色區域而較低溫度的黑體靠近紅色區域。
在室溫下,黑體輻射的能量集中在長波電磁輻射和遠紅外波段;當黑體溫度到幾百攝氏度之后,黑體開始發出可見光。以鋼材為例根據溫度的升高過程,分別變為紅色,橙色,黃色,當溫度超過1300攝氏度時開始發白色和藍色。當黑體變為白色的時候,它同時會放出大量的紫外線。
?
? ? ? ? 色溫規律:
? ? ? ? 色溫越高,光色越偏藍;色溫越低則偏紅。
? ? ? ? 某一種色光比其它色光的色溫高時,說明該色光比其它色光偏藍,反之則偏紅;
? ? ? ? 同樣,當一種色光比其它色光偏藍時說明該色光的色溫偏高,反之偏低。
?
? ?由于人眼具有獨特的適應性,使我們有的時候不能發現色溫的變化。比如在鎢絲燈下呆久了,并不會覺得鎢絲燈下的白紙偏紅,如果突然把日光燈改為鎢絲燈照明,就會覺查到白紙的顏色偏紅了,但這種感覺也只能夠持續一會兒。
? ? ? ?攝像機的CCD并不能像人眼那樣具有適應性,所以如果攝像機的色彩調整同景物照明的色溫不一致就會發生偏色。白平衡就是為了避免偏色的出現。從而引出白平衡概念。
?
【AWB】Auto White Balance?
概念
? ? ? ?白平衡就是針對不同色溫條件下,通過調整攝像機內部的色彩電路使拍攝出來的影像抵消偏色,更接近人眼的視覺習慣。白平衡可以簡單地理解為在任意色溫條件下,攝像機鏡頭所拍攝的標準白色經過電路的調整,使之成像后仍然為白色。這是一種經常出現的情況,但不是全部,白平衡其實是通過攝像機內部的電路調整(改變藍、綠、紅三個CCD電平的平衡關系)使反射到鏡頭里的光線都呈現為消色。如果以偏紅的色光來調整白平衡,那么該色光的影像就為消色,而其他色彩的景物就會偏藍(補色關系)。
? ? ? 【備注】消色就是指黑白灰三種顏色。黑白灰的物體對光源的光譜成分不是有選擇地吸收和反射而是等量吸收和等量反射各種光譜成分。這時物體看上去沒有了色彩。對各種光譜成分全部吸收的表面,看上去是黑色,等量吸收一部分等量反射一部分的表面是灰色,反射絕大部分而吸收極小部分是白色。消色和任何色彩搭配在一起,都顯得和諧協調。
? ? ? ?白平衡是一個很抽象的概念,最通俗的理解就是讓白色所成的像依然為白色,如果白是白,那其他景物的影像就會接近人眼的色彩視覺習慣。調整白平衡的過程叫做白平衡調整,白平衡調整在前期設備上一般有三種方式:預置白平衡、手動白平衡調整和自動跟蹤白平衡調整。通常按照白平衡調整的程序,推動白平衡的調整開關,白平衡調整電路開始工作,自動完成調校工作,并記錄調校結果。如果掌握了白平衡的工作原理,那么使用起來會更加有的放矢,得心應手。
工作原理
? ? ? ? ?攝像機內部有三個CCD電子耦合元件,他們分別感受藍色、綠色、紅色的光線,在預置情況下這三個感光電路電子放大比例是相同的,為1:1:1的關系,白平衡的調整就是根據被調校的景物改變了這種比例關系。比如被調校景物的藍、綠、紅色光的比例關系是2:1:1(藍光比例多,色溫偏高),那么白平衡調整后的比例關系為1:2:2,調整后的電路放大比例中明顯藍的比例減少,增加了綠和紅的比例,這樣被調校景物通過白平衡調整電路到所拍攝的影像,藍、綠、紅的比例才會相同。也就是說如果被調校的白色偏一點藍,那么白平衡調整就改變正常的比例關系減弱藍電路的放大,同時增加綠和紅的比例,使所成影像依然為白色
? ? ? ?換一個思路來考慮白平衡調整的問題,攝像機在白平衡調整容度之內不會“拒絕”放在鏡頭前面的被調校景物,就是說鏡頭可以對著任何景物來調整白平衡。大多情況下使用白色的調白板(卡)來調整白平衡,是因為白色調白板(卡)可最有效地反映環境的色溫,其實很多時候某種環境下白板(卡)并不是白色,多多少少會偏一點藍或其它的顏色,經驗豐富的攝像也會利用藍天來調白平衡,從而得到偏紅黃色調的畫面。搞清楚白平衡的工作原理之后,再使用的時候就會大膽地嘗試不同的效果,豐富了攝像創作。
? ? ? ?數碼相機白平衡的調整通常有三種模式;自動白平衡,分檔設定白平衡,精確設定白平衡(手動設定模式)。不同的相機設有不同調節白平衡的方式。一般的普及型的數碼相機大都采用自動白平衡。準專業數碼相機大都設有分檔設定白平衡。專業的數碼相機設有精確白平衡(手動設定模式)。專業數碼相機這三種模式的白平衡都擁有,準專業數碼相機擁有自動和分檔設定白平衡。可根據使用者的不同需要而選用。
? ? ? ?自動白平衡,是依賴數碼相機里的測色溫系統,測出紅光和藍光的相對比例。再依據次數據調整曝光,產生紅、綠、藍電信號的增益。自動白平衡最大的優勢是;簡單、快潔。但有時按它的調整拍攝離準確的色彩還原還相距甚遠。有時它還會幫倒忙。
? ? ? ?分檔設定白平衡,是按光源種類分和色溫值分兩類。大多數數碼相機都是按光源種類分的這類。在相機上分別設有日光、陰天、日光燈、白熾燈、閃光燈的圖標檔位。拍攝時只需將拍攝時的光源種類和相機上的白平衡檔位相吻合就可拍出較為準確的色彩。但由于分設檔位少,分設檔位的精度不高,在一些特殊光照條件下拍攝就不能準確的記錄色彩。按色溫分類的白平衡,理論上講其精度要高于按光源種類分檔。但它要求使用者要記住各種光源的色溫值,這就給使用者帶來極大的麻煩。故用此分檔白平衡的相機較少。
?
精確白平衡(手動設定模式),是在拍攝現場光的條件下,用白紙或白色物體充滿鏡頭視野進行白平衡調節。經過這樣的調試再拍攝,記錄的色彩將是非常準確的這是目前最準確的白平衡調節方式。白平衡的功能給我們攝影帶來了許多的便利和意想不到的效果。如攝影棚攝影對燈光的色溫要求就可不必那么高。白熾燈下依然可拍出準確的色彩。也不必為日光燈給我們帶來的青色而煩惱。我們可以在較高色溫條件下設定白平衡,在較低色溫情況下拍攝,使畫面帶上暖色調。反之,也可在低色溫條件下設定,在高色溫下拍攝也可產生特別的效果。在分檔設定白平衡里,也可有意的將光源檔與現場光設定不一致,亦可同樣的產生不同的藝術效果
【AE】Auto Exposure
? ? ? ?自動曝光是相機根據光線的強弱自動調整曝光量,防止曝光過度或者不足,但是,在場景反差很大的時候會出現誤差(比如舞臺的場景),光圈優先和快門優先都是自動曝光的范疇,除非很高檔的相機,這兩種功能不會同時出現在一個相機上,在自動曝光的同時也讓你有部分選擇的權利,當使用光圈優先的功能時,特別是小光圈時,要注意此時的快門速度會相應的調得很低,端穩相機防止圖像不清晰
? ? ? ?自動曝光,主要分為三類,全自動程式曝光、光圈先決曝光、快門先決曝光
【CCM】Color Correction Matrix
【IMP】?
【AI】Auto Iris 自動光圈
【AntiFlicker?】 抗閃爍
【ColorTone】冷暖色調
色彩的冷暖分別。色彩學上根據心理感受,把顏色分為暖色調(紅、橙、黃)、冷色調(青、藍)和中性色調(紫、綠、黑、灰、白)。
?
【RDC】Dynamic Range Compression
? 即動態范圍壓縮,目的是調整圖像的動態范圍,使得圖像顯示出更多的信息。 DRC 模塊是一個基于人眼視覺系統特性的高級局部色階映射(多空間動態范圍壓縮)引擎。
【AntiFalseColor】去假彩
?
真彩色(True Color):真彩色是指在組成一幅彩色圖像的每個像素值中,有R、G、B三個基色分量,每個基色分量直接決定顯示設備的基色強度產生彩色。
偽彩色(Pseudo Color):每個像素的顏色不是由每個基色分量的數值直接決定,而是把像素值當作顏色查找表(color look-up table,CLUT)的表項入口地址,去查找一個顯示圖像時使用的R,G,B強度值,用查找出的R,G,B強度值合成產生彩色。
假彩色(False Color):將多波段單色影像合成為假彩色影像,如landsat 7/ETM+有八個波段,用其中三個合成就是假彩色。
從實現技術上講,假彩色與真彩色是一致的,都是R、G、B分量組合顯示;偽彩色顯示調用的是顏色表。
?
【AntiFog】去霧
去霧原理很復雜,可以參考鏈接:
http://blog.csdn.net/baimafujinji/article/details/27206237
http://blog.csdn.net/occupy8/article/details/40322683
【Defect Pixel】壞點
【ShadingAttr】暗角校正屬性
【ShadingTable】暗角補償查找表
【Denoise】噪點抑制
【SharpenAttr】邊緣銳化屬性
【DemosaicAttr】去馬賽克屬性
【NoiseProfile】噪聲型式表
【CrosstalkAttr】CrossTalk remove Attr
【DIS】?
【FPN】獲取內部狀態擴展信息QueryInnerStateInfoEx
【LostFrameStrategy】丟幀策略
?
gamma校正原理
http://blog.csdn.net/u013286409/article/details/50239377
?
圖2中左圖為原圖,中圖為gamma?=?1/2.2在校正結果,原圖中左半側的灰度值較高,右半側的灰度值較低,經過gamma?=?1/2.2校正后(中圖),左側的對比度降低(見胡須),右側在對比度提高(明顯可以看清面容),同時圖像在的整體灰度值提高。
右圖為gamma?=?2.2在校正結果,校正后,左側的對比度提高(見胡須),右側在對比度降低(面容更不清楚了),同時圖像在的整體灰度值降低。
值得一提的是,人眼是按照gamma?<?1的曲線對輸入圖像進行處理的。
?
#include?<opencv2/core/core.hpp>?? #include?<opencv2/imgproc/imgproc.hpp>?? #include?<opencv2/highgui/highgui.hpp>?? ??? #include?<iostream>?? ??? using?namespace?cv;?? using?namespace?std;?? ?? //?Normalizes?a?given?image?into?a?value?range?between?0?and?255.?? Mat?norm_0_255(const?Mat&?src)?{?? ????//?Create?and?return?normalized?image:?? ????Mat?dst;?? ????switch(src.channels())?{?? ????case?1:?? ????????cv::normalize(src,?dst,?0,?255,?NORM_MINMAX,?CV_8UC1);?? ????????break;?? ????case?3:?? ????????cv::normalize(src,?dst,?0,?255,?NORM_MINMAX,?CV_8UC3);?? ????????break;?? ????default:?? ????????src.copyTo(dst);?? ????????break;?? ????}?? ????return?dst;?? }?? ?? int?main(int?argc,?const?char?*argv[])?{?? ????//?Get?filename?to?the?source?image:?? ????if?(argc?!=?2)?{?? ????????cout?<<?"usage:?"?<<?argv[0]?<<?"?<image.ext>"?<<?endl;?? ????????exit(1);?? ????}?? ????//?Load?image?&?get?skin?proportions:?? ????//Mat?image?=?imread(argv[1],?CV_LOAD_IMAGE_GRAYSCALE);?? ????Mat?image?=?imread(argv[1],?CV_LOAD_IMAGE_COLOR);?? ????//?Convert?to?floating?point:?? ????Mat?X;?? ????image.convertTo(X,?CV_32FC1);?? ????//image.convertTo(X,?CV_32F);?? ????//?Start?preprocessing:?? ????Mat?I;?? ????float?gamma?=?1/2.2;?? ????pow(X,?gamma,?I);?? ?? ?? ????//?Draw?it?on?screen:?? ????imshow("Original?Image",?image);?? ????imshow("Gamma?correction?image",?norm_0_255(I));?? ????//imwrite("origin.jpg",?image);?? ????imwrite("gamma_inv2.2.jpg",?norm_0_255(I));?? ????//?Show?the?images:?? ????waitKey(0);?? ????//?Success!?? ????return?0;?? }??
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>#include <iostream>using namespace cv;
using namespace std;// Normalizes a given image into a value range between 0 and 255.
Mat norm_0_255(const Mat& src) {// Create and return normalized image:Mat dst;switch(src.channels()) {case 1:cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC1);break;case 3:cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC3);break;default:src.copyTo(dst);break;}return dst;
}int main(int argc, const char *argv[]) {// Get filename to the source image:if (argc != 2) {cout << "usage: " << argv[0] << " <image.ext>" << endl;exit(1);}// Load image & get skin proportions://Mat image = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);Mat image = imread(argv[1], CV_LOAD_IMAGE_COLOR);// Convert to floating point:Mat X;image.convertTo(X, CV_32FC1);//image.convertTo(X, CV_32F);// Start preprocessing:Mat I;float gamma = 1/2.2;pow(X, gamma, I);// Draw it on screen:imshow("Original Image", image);imshow("Gamma correction image", norm_0_255(I));//imwrite("origin.jpg", image);imwrite("gamma_inv2.2.jpg", norm_0_255(I));// Show the images:waitKey(0);// Success!return 0;
}
?
Gamma 校正
問題:什么是Gamma曲線矯正?Gamma曲線矯正是什么意思? ?????? Gamma曲線是一種特殊的色調曲線,當Gamma值等于1的時候,曲線為與坐標軸成45°的直線,這個時候表示輸入和輸出密度相同。高于1的Gamma值將會造成輸出亮化,低于1的Gamma值將會造成輸出暗化。總之,我們的要求是輸入和輸出比率盡可能地接近于1。在顯示器、掃描儀、打印機等輸入、輸出設備中這是一個相當常見并且比較重要的概念。在計算機系統中,由于顯卡或者顯示器的原因會出現實際輸出的圖像在亮度上有偏差,而Gamma曲線矯正就是通過一定的方法來矯正圖像的這種偏差的方法。一般情況下,當用于Gamma矯正的值大于1時,圖像的高光部分被壓縮而暗調部分被擴展,當Gamma矯正的值小于1時,圖像的高光部分被擴展而暗調部分被壓縮,Gamma矯正一般用于平滑的擴展暗調的細節。
圖1 CRT顯示器的亮度響應曲線圖
?
?圖1顯示的是一般CRT顯示器的亮度響應曲線,可以看到其輸入電壓提高一倍,亮度輸出并不是提高一倍,而是接近于兩倍,顯然這樣輸出的圖像同原來的圖像相比就發生了輸出亮化的現象,也就是說未經過Gamma矯正的CRT顯示器其Gamma值是小于1的。
????? 沒有經過Gamma矯正的設備會影響最終輸出圖像的顏色亮度,比如一種顏色由紅色和綠色組成,紅色的亮度為50%,綠色的亮度為25%,如果一個未經過Gamma矯正的CRT顯示器的Gamma值是2.5,那么輸出結果的亮度將分別為18%和3%,其亮度大大的降低了。
圖2? 按圖進行曲線補償
?????? 為了補償這方面的不足,我們需要使用反效果補償曲線來讓顯示器盡可能地輸出同輸入圖像相同的圖像,所以這個時候顯示器的輸入信號應該按照圖2所示的曲線進行補償,這樣才能在顯示器上得到比較理想的輸出結果。
圖3? 理想狀態下的曲線
?一般的反效果可以直接被賦予存儲在幀緩存中的圖像,使之Gamma曲線呈非線性,也可以通過RAMDAC進行這種反效果補償(或者說是Gamma曲線矯正)。這樣我們就可以在顯示器上看到同我們輸入的圖像接近的圖像了(如圖3)。當然圖3所示的曲線只是理想狀態下的情況,在實際應用中我們并不可能得到如此完美的曲線,所以不同的廠商之間所競爭的就是誰能做到最接近于這個效果。
?
?
?????? 顯示器的gamma值是用于定義一個顯示器的顯示特性的數學方法,是決定顯示器從黑色到白色的值。簡單的說,當顯示一個顏色從黑到白時(也就是0到1),顯示器的電壓也要隨之變化,但這個變化不是線性的。因為顯示器的物理特性決定了如果電壓的變化是線性的,顯示出來的亮度就不是線性的,這時,顯示的亮度就會很暗。所以,為了保整顯示出來的亮度是正常(線性)的,就需要對顯示器的電壓變化加以校正,這個值就是我們通常所說的gamma值。通常情況只有在調整HDRI圖片時和在做動畫渲染時會用到。
?????? γ校正(Gamma Correction,伽瑪校正):所 謂伽瑪校正就是對圖像的伽瑪曲線進行編輯,以對圖像進行非線性色調編輯的方法,檢出圖像信號中的深色部分和淺色部分,并使兩者比例增大,從而提高圖像對比 度效果。計算機繪圖領域慣以此屏幕輸出電壓與對應亮度的轉換關系曲線,稱為伽瑪曲線(Gamma Curve)。以傳統CRT(Cathode Ray Tube)屏幕的特性而言,該曲線通常是一個乘冪函數,Y=(X+e)γ,其中,Y為亮度、X為輸出電壓、e為補償系數、乘冪值(γ)為伽瑪值,改變乘冪 值(γ)的大小,就能改變CRT的伽瑪曲線。典型的Gamma值是0.45,它會使CRT的影像亮度呈現線性。使用CRT的電視機等顯示器屏幕,由于對于 輸入信號的發光灰度,不是線性函數,而是指數函數,因此必需校正。
在電視和圖形監視器中,顯像管發生的電子束及其生成的圖像亮度并不是隨顯像管的輸入電壓線性變化,電子流與輸入電壓相比是按照指數曲線變化的,輸入 電壓的指數要大于電子束的指數。這說明暗區的信號要比實際情況更暗,而亮區要比實際情況更高。所以,要重現攝像機拍攝的畫面,電視和監視器必須進行伽瑪補 償。這種伽瑪校正也可以由攝像機完成。我們對整個電視系統進行伽瑪補償的目的,是使攝像機根據入射光亮度與顯像管的亮度對稱而產生的輸出信號,所以應對圖 像信號引入一個相反的非線性失真,即與電視系統的伽瑪曲線對應的攝像機伽瑪曲線,它的值應為1/γ,我們稱為攝像機的伽瑪值。電視系統的伽瑪值約為? 2.2,所以電視系統的攝像機非線性補償伽瑪值為0.45。彩色顯像管的伽瑪值為2.8,它的圖像信號校正指數應為1/2.8=0.35,但由于顯像管內 外雜散光的影響,重現圖像的對比度和飽和度均有所降低,所以現在的彩色攝像機的伽瑪值仍多采用0.45。在實際應用中,我們可以根據實際情況在一定范圍內 調整伽瑪值,以獲得最佳效果。
?????? 今天有個朋友問γ校正的用處,這里簡單說一下:
?????? 伽馬校正最初是由于顯示器的陰極現象管(也就是物理上所說的示波管的陰極射線版)的成像扭曲引起的,為了不使畫面失真所以就用先特殊算法進行校正,此之謂γ校正。
?????? γ校正的原理是修改顯示系統的配色方案,本來顯示系統輸出的r g b電子槍線性的根據顯存中的各個顏色值輸出對應的控制電壓,但是通過伽碼校正可以把某個顏色值對應的輸出電壓調整高或調整低。達到校正顯示系統色澤的目的。同時可以用軟件的方法校正,就是對一副圖片設定某個顏色的顏色值變換成新的顏色值的對照表,然后用新的顏色值取代原來圖片中對應的顏色就行了呀。比如你先編寫一個控制rgb各個分量對應關系的曲線調節器,在曲線調節器里面調整控制曲線設置原來顏色多少對應目標顏色多少,然后根據設定的關系,修改要調整色澤的圖片每一個像素的顏色就可以了。
????? 數學公式可以深刻和精確的把握一個概念,卻不能表達概念的物理意義和本質含義,本貼試圖擺脫數學公式的陳述和推導,用言語來解釋gamma的本質含義。
?
原文鏈接:
http://blog.csdn.net/lichengyu/article/details/20840135
http://www.downhot.com/show/dnjc/160420120603552393894.html
總結
以上是生活随笔 為你收集整理的ISP算法介绍--------super Good 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。