【openCV】直方图均衡化

简单实现了直方图均衡化操作。

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值