Just a Computer Graphics Studio & My Life

Histogram Equalization (直方圖均衡化)是影像處理領域中利用圖像直方圖對比度進行調整的方法。

這種方法通常用來增加許多圖像的局部對比度,尤其是當圖像的有用數據的對比度相當接近的時候。透過這種方法,亮度可以更好地分佈在直方圖上。這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化透過有效地擴展常用的亮度來實現這種功能。

程式碼:

/**
	Theme: Histogram Equalization
	compiler: Visual Studio 2010 with OpenCV 2.4.3
	Date: 101/11/12
	Author: HappyMan
	Blog: https://cg2010studio.wordpress.com/
*/
/**
 * @function EqualizeHist_Demo.cpp
 * @brief Demo code for equalizeHist function
 * @author OpenCV team
 */

#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";

  /// Load image
  src = imread( argv[1], 1 );

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

  /// Convert to grayscale
  cvtColor( src, src, CV_BGR2GRAY );

  /// Apply Histogram Equalization
  equalizeHist( src, dst );

  /// Display results
  namedWindow( source_window, CV_WINDOW_AUTOSIZE );
  namedWindow( equalized_window, CV_WINDOW_AUTOSIZE );

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

  /// Save images
  imwrite("source.jpg", src);
  imwrite("equalized.jpg", dst);

  /// Wait until user exits the program
  waitKey(0);

  return 0;
}

我使用宿舍頂樓夜景相片來實驗~

source.jpg

equalized.jpg

接下來看直方圖的差異。

source histogram

equalized histogram

原理:直方圖均衡化 (Histogram Equalization)是通過灰度變換將一影像轉換為另一影像具有均衡直方圖,即在每個灰度級上都具有相同的像素點數過程。從分佈圖上的理解就是希望原始圖像中y軸的值在新的分佈中能盡可能的展開。變換過程是利用累​​積分佈函數對原始分佈進行映射,生成新的均勻拉伸的分佈。因此對應每個點的操作是尋找原始分佈中y值在均勻分佈中的位置,如下圖是理想的單純高斯分佈映射的示意圖:

另一程式碼可以均衡化彩色影像,把每個通道分別均衡化,再合併為彩色圖像。


/**
	Theme: Histogram Equalization
	Compiler: Dev C++ 4.9.9.2
	Library: OpenCV 2.0
	Date: 101/11/12
	Author: HappyMan
	Blog: https://cg2010studio.wordpress.com/
*/
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
int main()
{
	IplImage * image= cvLoadImage("night.jpg");
	//顯示原圖
	cvShowImage("Source",image);
	cvSaveImage("Source.jpg",image);

	IplImage* eqlimage=cvCreateImage(cvGetSize(image),image->depth,3);
	//分別均衡化每個信道
	IplImage* redImage=cvCreateImage(cvGetSize(image),image->depth,1);
	IplImage* greenImage=cvCreateImage(cvGetSize(image),image->depth,1);
	IplImage* blueImage=cvCreateImage(cvGetSize(image),image->depth,1);
	cvSplit(image,blueImage,greenImage,redImage,NULL);

	cvEqualizeHist(redImage,redImage);
	cvEqualizeHist(greenImage,greenImage);
	cvEqualizeHist(blueImage,blueImage);
	//均衡化後的圖像
	cvMerge(blueImage,greenImage,redImage,NULL,eqlimage);
	cvShowImage("Equalized",eqlimage);
	cvSaveImage("Equalized.jpg",eqlimage);
	cvWaitKey(0);
}

source.jpg


equalized.jpg

同樣來看直方圖的差異。

source histogram


equalized histogram

參考:WiKi – 直方圖均衡化OpenCV v2.4.3 documentation – Histogram Equalization直方圖應用:直方圖均衡化,直方圖匹配,對比直方圖、baidu – 直方圖均衡化

廣告

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: