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 後的圖案
> [color=blue]
* 除此之外,我還自己寫了計算並畫出直方圖的程式,來做比較

* 以下是我的程式碼
```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;
}
```