我們可透過拉伸直方圖,使直方圖覆蓋所有強度範圍,這種方法的確能提高影像對比度,但是在多數情況,影像模糊不是因為過窄的強度範圍,而是某區間的像素強度比例過高,這時可以製作一個映射表,使得調整之後的影像,能平均使用所有的強度,進而增加影像的整體對比度。

這就是直方圖等化的概念,以一個8位元強度範圍0~255的影像來說,意味著調整之後的影像,50%的像素強度低於128,25%的像素強度低於64,其他強度比例依此類推。


OpenCV直方圖等化

void equalizeHist(InputArray src, OutputArray dst)

  • src:輸入圖,8位元單通道圖。
  • dst:輸出圖,和輸入圖尺寸、型態相同。

equalizeHist()函式可得到直方圖等化後的影像,以下為流程,OpenCV已將流程封裝好,使用時只要直接呼叫equalizeHist()函式即可:

  1. 計算輸入圖的直方圖。
  2. 將直方圖歸一到所有bin的總合為255。
  3. 計算直方圖累計表。
  4. 用直方圖累計表完成各強度的映射,所以假設強度30所累積的比例為20%,映射的強度即為255*0.2,由於我們直方圖歸一化到255,所以假設強度30所累積的值為20,映射的強度即為20。

以下程式碼使用直方圖等化,讓影像對比度增加:

#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;

int main(){
Mat src = imread("src.jpg",CV_LOAD_IMAGE_GRAYSCALE);
Mat dst;
equalizeHist(src,dst);
imshow("window1", src);
imshow("window2", dst);
waitKey(0);

return 0;
}