Histogram Equalization 直方圖均勻化 (Hw1) === ## 安裝 OpenCV * 這次作業我使用 Linux 作業系統,並使用影像處理最長被使用的 OpenCV 函式庫 ``` $ sudo apt-get install libopencv-dev ``` * 雖然並不是最新的 opencv3 但基本的功能都有 * 使用 C++ 語法來實作影像處理,並使用 CMakeList.txt 來 compile ``` ///CMakeList.txt cmake_minimum_required(VERSION 2.8) project( ip_hw ) find_package( OpenCV REQUIRED ) add_executable( ip_hw equalizeHist.cpp ) target_link_libraries( ip_hw ${OpenCV_LIBS} ) ``` * 完成程式碼之後,在原始碼的目錄中執行以下指令進行編譯 ``` $ cmake . $ make ``` * 編譯完成後,會產生執行檔 ## 直方圖均勻化程式碼 * 我使用 opencv 裡面的內建函式 `void equalizeHist(InputArray src, OutputArray dst)`來完成直方圖均勻化 ![右邊為原始圖檔,左邊是 equalizeHist 後的圖案](https://i.imgur.com/W4dCWjX.png) > 右邊為原始圖檔,左邊是 equalizeHist 後的圖案 > [color=blue] * 除此之外,我還自己寫了計算並畫出直方圖的程式,來做比較 ![](https://i.imgur.com/S2YUJFh.png) * 以下是我的程式碼 ```c++= #include <cstdio> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; Mat drawHist(const Mat &image){ Mat hist; int histSize = 256; float range[] = {0, 255}; const float* histRange = {range}; calcHist( &image, 1, 0, Mat(), hist, 1, &histSize, &histRange); Mat output(256, 256, CV_8UC1, Scalar(255)); float histmax = 0; for(int i=0; i<256; i++){ if(hist.at<float>(i) > histmax) histmax = hist.at<float>(i); } for(int i=0; i<256; i++){ int intensity = static_cast<int>(hist.at<float>(i)*0.9*256/histmax); line(output, Point(i, 255), Point(i, 255-intensity), Scalar(0)); } return output; } int main(){ Mat src = imread("ip_hw1_p1.png",CV_LOAD_IMAGE_GRAYSCALE); Mat dst; equalizeHist(src,dst); imshow("original", src); imshow("original hist", drawHist(src)); imshow("equalizeHist", dst); imshow("equalizeHist hist", drawHist(dst)); waitKey(0); return 0; } ```