您的位置:首页 > 运维架构

【openCV】直方图均衡化

2016-10-13 09:36 288 查看
简单实现了直方图均衡化操作。

#include "opencv2/opencv.hpp"

#define HISTOGRAM_SIZE 256
#define MAX_INTENSITY 255

int histogram[HISTOGRAM_SIZE];
float sum_histogram[HISTOGRAM_SIZE];
int main(){
// 从文件中加载原图
IplImage *srcImage = cvLoadImage("image.jpg", CV_LOAD_IMAGE_UNCHANGED);
if(srcImage == NULL)
{//如果读入图像失败
fprintf(stderr, "Can not load image\n");
return 0;
}

// 转为灰度图
IplImage *grayImage = NULL;
grayImage =  cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);
cvCvtColor(srcImage, grayImage, CV_BGR2GRAY);
cvShowImage("Original_Gray_Level_Image",grayImage);
cvWaitKey(0);
cvDestroyWindow("Original_Gray_Level_Image");

cvReleaseImage(&srcImage);

//统计灰度出现次数
memset(histogram,0,HISTOGRAM_SIZE*sizeof(int));
CvSize size = cvGetSize(grayImage);
for (int i = 0;i < size.height;i++){
for (int j = 0;j < size.width;j++){
CvScalar s = cvGet2D(grayImage,i,j);
unsigned char gray_level = s.val[0];
++(histogram[gray_level]);
}
}

//将灰度出现次数转化为灰度出现频率
int pixelCount = size.height * size.width;
for (int i = 0;i < HISTOGRAM_SIZE;i++){
sum_histogram[i] = (histogram[i] * 1.0) / pixelCount;
}

//将灰度出现频率归一化
for (int i = 1;i < HISTOGRAM_SIZE;i++){
sum_histogram[i] += sum_histogram[i-1];
}

//直方图均衡化处理灰度图像
for (int i = 0;i < size.height;i++){
for (int j = 0;j < size.width;j++){
CvScalar s = cvGet2D(grayImage,i,j);
unsigned char gray_level = s.val[0];
s.val[0] = sum_histogram[gray_level] * MAX_INTENSITY;
cvSet2D(grayImage,i,j,s);
}
}

cvShowImage("Histogram_Equalized_Image",grayImage);
cvWaitKey(0);
cvDestroyWindow("Histogram_Equalized_Image");

cvReleaseImage(&grayImage);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息