一、圖像直方圖Histogram
圖像直方圖,是指對整個圖像像在灰度範圍內的像素值(0~255)統計出現頻率次數,據此生成的直方圖,稱爲圖像直方圖-直方圖。直方圖反映了圖像灰度的分佈情況,是圖像的統計學特徵。
二、直方圖均衡化
-
直方圖均衡化是一種提高圖像對比度的方法,拉伸圖像灰度值範圍,讓圖像更均衡。對於圖像的特徵提取是非常有用的
-
直方圖均衡化是通過使用累積函數對灰度值進行“調整”以實現對比度的增強,其中心思想是把原始圖像的灰度直方圖從比較集中的某個灰度區間變成在全部灰度範圍內的均勻分佈。也就是把一個分佈(給定的直方圖)映射到另一個分佈(一個更寬更統一的強度值分佈),所以強度值分佈會在整個範圍內展開,要實現均衡化的效果,映射函數應該是一個累積分佈函數(cdf)。對於直方圖H(i),它的累積分佈H’(i)是:
要使用其作爲映射函數,我們必須對最大值爲255(或者用圖像的最大強度值)的累積分佈H’(i)進行歸一化,同上,累積分佈函數爲:
最後,使用一個簡單的映射過程來獲得均衡化後像素的強度值:
圖像直方圖均衡化的實質是近似均勻分佈,均衡化圖像的動態範圍擴大了,但其被值擴大了量化間隔,而量化級別反而減少了,原來灰度不同的像素經處理後可能變得相同,這樣就形成了一片相同灰度的區域,各區域之間有明顯的邊界,造成對比度提高的視覺效果。如果原始圖像對比度本來就很高,這再均衡化會降低圖像對比度。
三、equalizeHist
void cv::equalizeHist ( InputArray src,
OutputArray dst
)
- src:8-bit單通道 輸入圖像
- dst: 目標圖像,與原圖像有相同的尺寸和類型
equalizeHist()函數實現的圖像直方圖均衡化算法就是把直方圖的每個灰度級進行歸一化處理,求每種灰度的累積分佈,得到一個映射的灰度映射表,然後根據相應的灰度值來修正原圖中的每個像素的像素值。
四、示例
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src, dst;
//1. 讀取圖像
src = imread("images/02.png");
if (src.empty()) {
cout << "Usage: ./Histogram_Demo <path_to_image>" << endl;
return -1;
}
// 2. 將其轉換爲灰度:
cvtColor(src, src, COLOR_BGR2GRAY);
// 3. 使用函數cv :: equalizeHist應用直方圖均衡
equalizeHist(src, dst);
// 4. 顯示兩個圖像(原始圖像和均衡圖像):
imshow("Source image", src);
imshow("Equalized Image", dst);
waitKey(0);
return 0;
}