C语言实现BMP图像处理(直方图均衡化)

计算步骤:

1)统计各灰度值的概率;

2)计算了累积概率直方图(CDF);

3)取整扩展:Tk = int[ (L-1)*Tk];

#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main(int* argc, char** argv)
{
	FILE* fp = fopen("./01.bmp", "rb");
	if (fp == 0)
		return 0;
	BITMAPFILEHEADER fileHead;
	fread(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);
	
	BITMAPINFOHEADER infoHead;
	fread(&infoHead, sizeof(BITMAPINFOHEADER), 1, fp);
	int width = infoHead.biWidth;
	int height = infoHead.biHeight;
	int biCount = infoHead.biBitCount;

	int lineByte = (biCount*width / 8 + 3) / 4 * 4;
	RGBQUAD* pColorTable;
	pColorTable = new RGBQUAD[256];
	fread(pColorTable, sizeof(RGBQUAD), 256, fp);

	unsigned char* pBmpBuf;
	pBmpBuf = new unsigned char[lineByte*height];
	fread(pBmpBuf, lineByte*height, 1, fp);
	fclose(fp);
	
	// 统计概率
	double st[256] = { 0 };
	int st1[256] = { 0 };
	int t;
	for (int i = 0; i < height; ++i){
		for (int j = 0; j < width; ++j){
			t = *(pBmpBuf + i*lineByte + j);
			st[t]++;
		}
	}
	// 计算累加直方图并完成映射
	st[0] = st[0] / (width*height);
	st1[0] = round(double((256 - 1)*st[0]));
	for (int i = 1; i < 256; ++i){
		st[i] = st[i] / (width*height);
		st[i] = st[i] + st[i - 1];
		st1[i] = int(round(double((256 - 1)*st[i])));
		printf("st[i] = %d, st1[t] = %d\n", st[i], st1[i]);
	}
	
	// 新图像的像素填充
	unsigned char* pBmpBuf1;
	pBmpBuf1 = new unsigned char[lineByte*height];
	for (int i = 0; i < height; ++i){
		for (int j = 0; j < width; ++j){
			t = *(pBmpBuf + i*lineByte + j);
			*(pBmpBuf1 + i*lineByte + j) = st1[t];
		}
	}

	FILE* fop = fopen("./imhist.bmp", "wb");
	if (fop == 0)
		return 0;
	fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fop);
	fwrite(&infoHead, sizeof(BITMAPINFOHEADER), 1, fop);
	fwrite(pColorTable, sizeof(RGBQUAD), 256, fop);
	fwrite(pBmpBuf1, lineByte*height, 1, fop);
	fclose(fop);

	system("pause");
	return 0;
}

实验结果:

           原图                            直方图均衡化

              

实验结果分析:对比原图与实验结果图,原图中,头发和衣领处灰度值较低的地方在结果图中灰度值更低,而原图中,额头中间偏右处较亮,在结果图中更亮,灰度值更大。整体上直方图均衡化拉伸了全局对比度。

后续持续更新用C语言实现图像处理算法,敬请期待,欢迎关注。

  • 20
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
直方图均衡化是一种图像处理方法,可以增强图像的对比度和亮度。在C语言中,可以按照以下步骤实现直方图均衡化: 1.读取图像数据,并将其转换为灰度图像。 2.计算灰度图像的直方图,即统计每个灰度级别的像素数量。 3.计算累计直方图,即将直方图中每个灰度级别的像素数量累加起来。 4.计算直方图均衡化的变换函数,将累计直方图中的像素值映射到[0,255]的范围内。 5.将变换函数应用于原始图像中的每个像素,并将结果存储在输出图像中。 下面是一份基于C语言的简单实现代码: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define WIDTH 512 #define HEIGHT 512 #define MAX_PIXEL 255 int main() { FILE *fpIn = fopen("input.bmp", "rb"); FILE *fpOut = fopen("output.bmp", "wb"); unsigned char header[54], colorTable[1024]; unsigned char imgIn[HEIGHT][WIDTH], imgOut[HEIGHT][WIDTH]; int histogram[MAX_PIXEL+1] = {0}; int cdf[MAX_PIXEL+1] = {0}; float transfer[MAX_PIXEL+1] = {0}; fread(header, sizeof(unsigned char), 54, fpIn); fread(colorTable, sizeof(unsigned char), 1024, fpIn); fread(imgIn, sizeof(unsigned char), WIDTH*HEIGHT, fpIn); for(int i = 0; i < HEIGHT; i++){ for(int j = 0; j < WIDTH; j++){ int pixel = imgIn[i][j]; histogram[pixel]++; } } cdf[0] = histogram[0]; for(int i = 1; i <= MAX_PIXEL; i++){ cdf[i] = cdf[i-1] + histogram[i]; } float totalPixel = WIDTH * HEIGHT; for(int i = 0; i <= MAX_PIXEL; i++){ transfer[i] = round((cdf[i] / totalPixel) * MAX_PIXEL); } for(int i = 0; i < HEIGHT; i++){ for(int j = 0; j < WIDTH; j++){ imgOut[i][j] = transfer[imgIn[i][j]]; } } fwrite(header, sizeof(unsigned char), 54, fpOut); fwrite(colorTable, sizeof(unsigned char), 1024, fpOut); fwrite(imgOut, sizeof(unsigned char), WIDTH*HEIGHT, fpOut); fclose(fpIn); fclose(fpOut); return 0; } ``` 这份代码中,我们首先读取输入图像并将其转换为灰度图像。然后,我们计算灰度图像的直方图,并使用它来计算累计直方图和变换函数。最后,我们将变换函数应用于原始图像中的每个像素,并将结果存储在输出图像中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值