直方图均衡实现

实现图像直方图均衡

直方图均衡是空间域增强方法中的灰度处理的一种,主要是通过灰度级均衡来实现的。

根据公式在这里插入图片描述Dm:代表灰度级 ;A0:代表图像像素总数;

在这里插入图片描述表示0~Da的灰度级之和。
所以可以将代码分为三个部分:
1、计算直方图灰度级
2、根据公式计算新的灰度级
3、用新的灰度级代替原先的灰度级

void CMFCApplication1View::hisEqualiz(BYTE* image, int w, int h, BYTE* outImg)
{
	//直方图均衡
	//1、计算直方图
	int his[256] = {0};
	int n,i,j;
	for (n = 0; n < 256; n++)
		his[n] = 0;

	for (i = 0; i < h; i++)
		for (j = 0; j < w; j++)
			his[image[i * w + j]]++;
	for (n = 1; n < 256; n++)
		his[n] += his[n - 1];

	//2、计算新的灰度级
	BYTE gray[256] = {0};
	float cons;
	cons = 255. / his[255];

	for (n = 0; n < 256; n++)
		gray[n] = (BYTE)(cons * his[n]);

	//3、用新的灰度级替代旧的灰度级
	for (i = 0; i < h; i++)
		for (j = 0; j < w; j++)
			outImg[i * w + j] = gray[image[i * w + j]];
}	

w,h:表示图像的长和宽,outImg:存储输出图像信息
image:用于存储图像信息;如果没有,需要先获取一下图像的信息。

typedef unsigned char BYTE 
FILE* fpImg = fopen(xxx,"rb");
BYTE * rowBuff;
int rowLen;
int bicount;
BYTE * image;

fread(&bmiHeader, sizeof(BITMAPINFOHEADER), 1, fpImg);
bicount = bmiHeader.biBitCount;
rowLen = ((width * bicount) / 8 + 3) / 4 * 4;
rowBuff = new BYTE[rowLen];
image = new BYTE[width * height];
for (int i = height - 1; i >= 0; i--)
{
	fread(rowBuff, 1, rowLen, fpImg);
	memcpy(image + i * width, rowBuff, width);
}

结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值