Opencv學(xué)習(xí)-LUT函數(shù)
LUT(LOOK -UP-TABLE)查找表,我表達(dá)能力不好,加上對這個了解的不是很深刻,對于LUP具體解釋用文字不好說。不過看下面例子應(yīng)該可以看懂。
首先我們看單通道圖像。
?????? 對于8位單通道圖片,其像素灰度為0-255,假如我們想將圖像某一灰度值換成其他灰度值,用查找就很好用。
? 例如:我們想將一張圖片灰度為0-100的像素的灰度變成0,101-200的變成100,201-255的變成255。我們就可已建立如下的一張表格;
當(dāng)把此表格應(yīng)用到圖片時,圖片0-100灰度的像素灰度就變成0,101-200的變成100,201-255的就變成255。
映射表差不多就是這個意思。
對于8位3通道的查找表和單通道的差不多。opencv用的最簡單的 一種。其內(nèi)部實現(xiàn)每一個通道都分別建立一張表,表格的建立和單通道的一樣。
處理圖片時,分別對每一個通道應(yīng)用各自的表。
? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ?????????? ? ? ? ? ? ? ? ? ? ? ? ? ???????
當(dāng)把如上表格應(yīng)用到圖片時,R通道的0-100灰度的像素灰度就變成0,101-200的變成100,201-255的就變成255。G通道的0-100灰度的像素灰度就變成50,101-200的變成100,201-255的就變成200。B通道的0-100灰度的像素灰度就變成50,101-200的變成200,201-255的就變成100。和單通道一樣。
Opencv中的LUT函數(shù)
?? opencv 2中的LUT函數(shù)為??? void LUT(InputArray src, InputArray lut, OutputArray dst,int?? interpolation);
????????????????????????????????????????????????????????? src表示的是輸入圖像(可以是單通道也可是3通道)
????????????????????????????????????????????????????????? lut表示查找表(查找表也可以是單通道,也可以是3通道,如果輸入圖像為單通道,那查找表必須為單通道,
??????????????????????????????????????????????????????????????????????????????????????? 若輸入圖像為3通道,查找表可以為單通道,也可以為3通道,若為單通道則表示對圖像3個
?????????????????????????????????????????????????????????????????????????????????? 通道都應(yīng)用這個表,若為3通道則分別應(yīng)用 )
????????????????????????????????????????????????????????? dst表示輸出圖像,
????????????????????????????????????????????????????????? interpolation表示插值,這個參數(shù)沒有用,源代碼里面也沒有用它,默認(rèn)為0就行,傳其他值會報錯。
??? opencv3里面的LUT函數(shù)??? void LUT(InputArray src, InputArray lut, OutputArray dst);
?? 和2一樣,不過沒有了interpolation這個參數(shù)。
源代碼 單通道圖片處理:
#includeusing?namespace?cv; int?main() { ????//查找表,數(shù)組的下標(biāo)對應(yīng)圖片里面的灰度值 ????//例如lutData[20]=0;表示灰度為20的像素其對應(yīng)的值0. ????//可能這樣說的不清楚仔細(xì)看下代碼就清楚了。 ????uchar?lutData[256]; ????for?(int?i?=?0;?i<256;?i++) ????{ ????????if(i100?&&?i??200) ????????????lutData[i]?=?255; ????} ????Mat?lut(1,?256,?CV_8UC1,?lutData); ????Mat?a?=?imread("C:\Users\11206\Desktop\OpencvTestImage\2.jpg",?CV_LOAD_IMAGE_GRAYSCALE); ????Mat?b; ????namedWindow("anjis",?CV_WINDOW_AUTOSIZE); ????namedWindow("anjis1",?CV_WINDOW_AUTOSIZE); ????imshow("anjis",?a); ????LUT(a,?lut,?b); ????imshow("anjis1",?b); ????waitKey(); }結(jié)果顯示:3通道彩色圖像源代碼:
#includeusing?namespace?cv; int?main() { uchar?lutData[256?*?3]; int?j?=?0; for?(int?i?=?0;?i<256;?i++) { if?(i?100?&&?i??200) { lutData[i?*?3]?=?255; lutData[i?*?3?+?1]?=?200; lutData[i?*?3?+?2]?=?100; } } Mat?lut(1,?256,?CV_8UC3,?lutData); Mat?a?=?imread("C:\Users\11206\Desktop\OpencvTestImage\2.jpg",?CV_LOAD_IMAGE_ANYCOLOR); Mat?b; namedWindow("anjis",?CV_WINDOW_AUTOSIZE); namedWindow("anjis1",?CV_WINDOW_AUTOSIZE); imshow("anjis",?a); LUT(a,?lut,?b); imshow("anjis1",?b); waitKey(); }
輸出結(jié)果為:
? 寫完了,可能寫的不太好,不過還是希望有一些幫助。