直方图均衡化

来源:互联网 发布:js防水涂料报价 编辑:程序博客网 时间:2024/06/05 05:38

函数cvEqualizeHist()用来把灰度图形的直方图均衡化,由于经常要绘制图像的直方图,索性构造一个函数,下面的程序引自http://blog.sina.com.cn/s/blog_6e3c5ee30102vje2.html,在原文基础上添加了灰度图像的均衡化并显示效果。

#include "opencv2/core/core.hpp"  
#include<cv.h>
#include<highgui.h>
using namespace cv;
using namespace std;
//用来绘制单通道图像的灰度图;
void histogram(char* winName, IplImage *img)
{
int size = 256;
float range[] = { 0, 255 };
float* ranges[] = { range };
CvHistogram* hist = cvCreateHist(1, &size, CV_HIST_ARRAY, ranges, 1);
cvCalcHist(&img, hist, 0, NULL);
float max = 0;
cvGetMinMaxHistValue(hist, NULL, &max, NULL, NULL);
IplImage* dst = cvCreateImage(cvSize(400, 300), 8, 3);
cvSet(dst, cvScalarAll(255), 0);
double bin_width = (double)dst->width / size;
double bin_unith = (double)dst->height / max;
for (int i = 0; i<size; i++)
{
CvPoint p0 = cvPoint(i*bin_width, dst->height);
CvPoint p1 = cvPoint((i + 1)*bin_width, dst->height - cvGetReal1D(hist->bins, i)*bin_unith);
cvRectangle(dst, p0, p1, cvScalar(0, 0,0), -1, 8, 0);
}
cvNamedWindow(winName, 1);
cvShowImage(winName, dst);
}


int main()
{
IplImage* src = cvLoadImage("photo.jpg", 0);//读取灰度形式
cvNamedWindow("src"); cvShowImage("src", src);
histogram("origion", src);//原图的直方图
IplImage *dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, src->nChannels);
cvEqualizeHist(src, dst);//均衡化以后的直方图
cvNamedWindow("dst"); cvShowImage("dst", dst);
histogram("equal", dst);
cvWaitKey(0);
return 0;
}

原图


均衡化以后效果


0 0
原创粉丝点击