这篇文章主要为大家详细介绍了C语言实现BMP图像直方图均衡化处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了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语言实现BMP图像处理(直方图均衡化)
基础教程推荐
猜你喜欢
- C/C++编程中const的使用详解 2023-03-26
- 如何C++使用模板特化功能 2023-03-05
- 一文带你了解C++中的字符替换方法 2023-07-20
- C语言基础全局变量与局部变量教程详解 2022-12-31
- C利用语言实现数据结构之队列 2022-11-22
- 详解c# Emit技术 2023-03-25
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- C++详细实现完整图书管理功能 2023-04-04
- C++中的atoi 函数简介 2023-01-05
- C语言 structural body结构体详解用法 2022-12-06