Opencv直方圖同等化(Equalization)

2018-09-18 11:39 更新

目標(biāo)

在本教程中,您將學(xué)習(xí):

  • 圖像直方圖是什么,為什么它是有用的
  • 通過使用OpenCV函數(shù)cv :: equalizeHist來均衡圖像的直方圖

理論

什么是圖像直方圖(Histogram)?

  • 它是圖像的強(qiáng)度分布的圖形表示。
  • 它量化所考慮的每個強(qiáng)度值的像素?cái)?shù)。

Opencv直方圖同等化

什么是直方圖Equalization?

  • 這是一種改善圖像對比度的方法,以擴(kuò)展強(qiáng)度范圍。
  • 為了使之更清晰,從上圖可以看出像素似乎聚集在可用的強(qiáng)度范圍的中間。什么直方圖均衡是伸展這個范圍??聪聢D:綠色圓圈表示人口密度低下。應(yīng)用均衡后,我們得到一個像中心的直方圖。產(chǎn)生的圖像顯示在右圖所示。

Opencv直方圖同等化

它是如何工作的?

  • 均衡意味著將一個分布(給定直方圖)映射到另一個分布(強(qiáng)度值的更寬和更均勻的分布),因此強(qiáng)度值在整個范圍內(nèi)擴(kuò)展。
  • 為了實(shí)現(xiàn)均衡效果,重映射應(yīng)該是累積分布函數(shù)(cdf)(更多細(xì)節(jié)參考學(xué)習(xí)OpenCV)。對于直方圖 H(i),其累積分布 H′(i) 為:

Opencv直方圖同等化

為了將其用作重映射功能,我們必須使H“(i )統(tǒng)一化,使得最大值為255(或圖像的強(qiáng)度的最大值)。從上面的例子,累積函數(shù)是:

Opencv直方圖同等化

最后,我們使用簡單的重新映射程序來獲得均衡圖像的強(qiáng)度值:

Opencv直方圖同等化

Code

  • 這個程序是做什么的?加載圖像將原始圖像轉(zhuǎn)換為灰度通過使用OpenCV函數(shù)cv :: equalizeHist來平衡直方圖在窗口中顯示源和均衡圖像。
  • 可下載的代碼:點(diǎn)擊這里
  • 代碼一覽:
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main( int, char** argv )
{
  Mat src, dst;
  const char* source_window = "Source image";
  const char* equalized_window = "Equalized Image";
  src = imread( argv[1], IMREAD_COLOR );
  if( src.empty() )
    { cout<<"Usage: ./EqualizeHist_Demo <path_to_image>"<<endl;
      return -1;
    }
  cvtColor( src, src, COLOR_BGR2GRAY );
  equalizeHist( src, dst );
  namedWindow( source_window, WINDOW_AUTOSIZE );
  namedWindow( equalized_window, WINDOW_AUTOSIZE );
  imshow( source_window, src );
  imshow( equalized_window, dst );
  waitKey(0);
  return 0;
}

說明

  • 聲明源和目標(biāo)圖像以及窗口名稱:
Mat src, dst;
char* source_window = "Source image";
char* equalized_window = "Equalized Image";
  • 加載源圖像:
src = imread( argv[1], 1 );
if( !src.data )
  { cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl;
    return -1;}
  • 將其轉(zhuǎn)換為灰度:
cvtColor( src, src, COLOR_BGR2GRAY );
equalizeHist( src, dst );

因?yàn)榭梢院苋菀椎乜吹?,唯一的參?shù)是原始圖像和輸出(均衡)圖像。

  • 顯示兩個圖像(原始和均衡):
namedWindow( source_window, WINDOW_AUTOSIZE );
namedWindow( equalized_window, WINDOW_AUTOSIZE );
imshow( source_window, src );
imshow( equalized_window, dst );
  • 等待用戶存在程序
waitKey(0);
return 0;

結(jié)果

  • 為了更好地了解均衡的結(jié)果,我們來介紹一個沒有太大對比度的圖像,比如:

Opencv直方圖同等化

順便說一下,這個直方圖:

Opencv直方圖同等化

注意像素圍繞直方圖的中心聚集。

  • 在我們的程序應(yīng)用均衡后,我們得到這個結(jié)果:

直方圖同等化

這個形象肯定有更多的對比。查看它的新直方圖,如下所示:

直方圖同等化

  • 注意像素的數(shù)量如何在強(qiáng)度范圍內(nèi)更多地分布。

注意
你想知道我們?nèi)绾萎嫵錾厦骘@示的直方圖數(shù)字?看看下面的教程!
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號