直方图均衡化代码

注:代码中使用可openCV。
#include
#include "cv.h"
#include "highgui.h"
using namespace std;

//直方图均衡化
int main()
{
IplImage *src,*dst;
IplImage *srcPrj,*dstPrj;
int width,height,widthStep;
int prjheight;
int histogram[256]={0};
int i,j;
uchar *pdata,*pdst;
src = cvLoadImage("pic.jpg",0); //读取灰度图
dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
width = src->width;height = src->height;widthStep = src->widthStep;
pdata = (uchar*)src->imageData;
for(i=0;i
for(j=0;j
histogram[pdata[i*widthStep+j]]++; //统计灰度直方图
}
}
prjheight = height*20;
srcPrj = cvCreateImage(cvSize(1024,prjheight),IPL_DEPTH_8U,1);
cvZero(srcPrj); //清零
for(i=0;i<1024;i++){
for(j=prjheight-1;j>prjheight-1-histogram[i/4] && j>=0;j--)
srcPrj->imageData[j*1024+i] = 255;
}
cvSaveImage("srcPrj.bmp",srcPrj);

//下面进行直方图均衡
double map[256];int sum=0;
//计算映射表
for(i=0;i<256;i++){
sum += histogram[i];
map[i] = (double)sum*255/(width*height) + 0.5;
}
//输出数据赋值
pdst = (uchar*)dst->imageData;
for(i=0;i
for(j=0;j
pdst[i*widthStep+j] = map[pdata[i*widthStep+j]];
}
}
cvSaveImage("dst.bmp",dst); //保存直方图均衡化后的图像
//计算灰度直方图
memset(histogram,0,sizeof(int)*256);
for(i=0;i
for(j=0;j
histogram[pdst[i*widthStep+j]]++; //统计灰度直方图
}
}
// prjheight = height*width/8;
dstPrj = cvCreateImage(cvSize(1024,prjheight),IPL_DEPTH_8U,1);
cvZero(dstPrj); //清零
for(i=0;i<1024;i++){
for(j=prjheight-1;j>prjheight-1-histogram[i/4] && j>=0;j--)
dstPrj->imageData[j*1024+i] = 255;
}
cvSaveImage("dstPrj.bmp",dstPrj);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvReleaseImage(&srcPrj);
cvReleaseImage(&dstPrj);
return 0;
}
原图及其灰度直方图:
直方图均衡化代码  直方图均衡化代码
直方图均衡化后的图像及其灰度直方图:
直方图均衡化代码  直方图均衡化代码




你可能感兴趣的:(直方图均衡化代码)