1. 程式人生 > >[計算機視覺] CImg庫繪製圖像灰度直方圖

[計算機視覺] CImg庫繪製圖像灰度直方圖

做計算機視覺Computer Vision作業時候要用CImg庫(即CImg.h標頭檔案),需要繪製圖像的灰度直方圖。網上搜索了一下貌似都沒找到相關的連結,只好屁顛屁顛的開啟5w多行的CImg.h檢視,誰知看著看著就發現,原來CImg庫有自帶的繪製圖像灰度直方圖的方法!!!

先po一下效果圖吧:


其實各位也可以直接開啟CImg.h,搜尋:histogram ,就能找到該方法了。如果嫌麻煩可以往下看~

主要使用程式碼:

CImg<int> histImg = GrayImg.histogram(256, 0, 255);
histImg.display_graph("Histogram", 3);

程式碼解釋:

1、CImg<...> 的template型別最好用int。(用unsigned char的直方圖會出奇怪的問題)

2、GrayImg同為CImg<int>類似,但是必須注意的是:如果僅僅做灰度圖的直方圖,GrayImg必須以下面的方式建立:

CImg<int> GrayImg = CImg<int>(width, height, 1, 1, 0);
      第4個引數必須為1,說明影象只有一個通道。如果該引數設為3,再讀取一幅灰度圖時,函式會預設影象為彩色影象(即3個通道, 只是3個通道的灰度值都一樣),從而會每個通道都統計一次,導致最後的直方圖所有灰度的畫素個數都是原來的3倍。(雖然 這樣對整個灰度圖趨勢沒影響~)

3、img.histogram(const unsigned int nb_levels, const T& min_value, const T& max_value)方法

      第1個引數為灰度級別(這裡是 統計256個灰度級別);第2、3個引數為灰度最小值和最大值,本來可以預設,但是預設的話出來的直方圖會出問題(看了下應該是這個函式的統計方法造成的),所以最好還是按照上面這樣寫

4、僅用上面這一行程式碼做不出上面圖那樣的效果,還要呼叫CImg的繪圖方法繪製display_graph

    (該方法也可以在CImg.h裡搜到)。第一個引數是顯示直方圖的視窗的title;第二個是int型別,代表影象樣式plot_type,這裡的3代表是條形(對於0:點狀;1:segments;2:樣條曲線)。當然這個方法還要很多預設引數,可以自行檢視CImg.h。