1. 程式人生 > >opencv中 equalizeHist()均衡化直方圖

opencv中 equalizeHist()均衡化直方圖

1、EqualizeHist函式

函式作用:

直方圖均衡化,,用於提高影象的質量

2、EqualizeHist函式呼叫形式

C++: void equalizeHist(InputArray src, OutputArray dst)


#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdio.h>
 
using namespace cv;
using namespace std;
int main()
{
	Mat src = imread("C://1.bmp", 1);
	cvtColor(src, src, CV_BGR2GRAY);
	Mat dst;
	equalizeHist(src, dst);
	imshow("TEST", dst);
	waitKey(0);
	return 0;
}

直方圖均衡化

目標

在這個教程中你將學到:

  • 什麼是影象的直方圖和為什麼影象的直方圖很有用
  • 用OpenCV函式 equalizeHist 對影象進行直方圖均衡化

原理

影象的直方圖是什麼?

  • 直方圖是影象中畫素強度分佈的圖形表達方式.
  • 它統計了每一個強度值所具有的畫素個數.
../../../../../_images/Histogram_Equalization_Theory_0.jpg

直方圖均衡化是什麼?

  • 直方圖均衡化是通過拉伸畫素強度分佈範圍來增強影象對比度的一種方法.
  • 說得更清楚一些, 以上面的直方圖為例, 你可以看到畫素主要集中在中間的一些強度值上. 直方圖均衡化要做的就是 拉伸 這個範圍. 見下面左圖: 綠圈圈出了 少有畫素分佈其上的 強度值. 對其應用均衡化後, 得到了中間圖所示的直方圖. 均衡化的影象見下面右圖.
../../../../../_images/Histogram_Equalization_Theory_1.jpg

直方圖均衡化是怎樣做到的?

  • 均衡化指的是把一個分佈 (給定的直方圖) 對映 到另一個分佈 (一個更寬更統一的強度值分佈), 所以強度值分佈會在整個範圍內展開.

  • 要想實現均衡化的效果, 對映函式應該是一個 累積分佈函式 (cdf)

    (更多細節, 參考*學習OpenCV*). 對於直方圖 H(i), 它的 累積分佈 H^{'}(i)是:

    H^{'}(i) = \sum_{0 \le j < i} H(j)

    要使用其作為對映函式, 我們必須對最大值為255 (或者用影象的最大強度值) 的累積分佈 H^{'}(i) 進行歸一化. 同上例, 累積分佈函式為:

    ../../../../../_images/Histogram_Equalization_Theory_2.jpg
  • 最後, 我們使用一個簡單的對映過程來獲得均衡化後像素的強度值:

    equalized( x, y ) = H^{'}( src(x,y) )

例程

  • 咋個例程是用來幹嘛的?

    • 載入源影象
    • 把源影象轉為灰度圖
    • 使用OpenCV函式 EqualizeHist 對直方圖均衡化
    • 在窗體中顯示源影象和均衡化後圖像.
  • 下載例程: 點選 這裡

  • 例程一瞥:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
  Mat src, dst;

  char* source_window = "Source image";
  char* equalized_window = "Equalized Image";

  /// 載入源影象
  src = imread( "C://1.bmp", 1 );

  if( !src.data )
    { cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl;
      return -1;}

  /// 轉為灰度圖
  cvtColor( src, src, CV_BGR2GRAY );

  /// 應用直方圖均衡化
  equalizeHist( src, dst );

  /// 顯示結果
  namedWindow( source_window, CV_WINDOW_AUTOSIZE );
  namedWindow( equalized_window, CV_WINDOW_AUTOSIZE );

  imshow( source_window, src );
  imshow( equalized_window, dst );

  /// 等待使用者按鍵退出程式
  waitKey(0);

  return 0;
}

結果

  1. 為了更好地觀察直方圖均衡化的效果, 我們使用一張對比度不強的圖片作為源影象輸入, 如下圖:

    ../../../../../_images/Histogram_Equalization_Original_Image.jpg

    它的直方圖為:

    ../../../../../_images/Histogram_Equalization_Original_Histogram.jpg

    注意到畫素大多集中在直方圖中間的強度上.

  2. 使用例程進行均衡化後, 我們得到下面的結果:

    ../../../../../_images/Histogram_Equalization_Equalized_Image.jpg

    這幅圖片顯然對比度更強. 再驗證一下均衡化後圖片的直方圖:

    ../../../../../_images/Histogram_Equalization_Equalized_Histogram.jpg

    注意到現在畫素在整個強度範圍內均衡分佈.

虹膜影象測試:
原影象:在這裡插入圖片描述
equalizeHist均衡化直方圖後:影象有些地方增強了。
在這裡插入圖片描述