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

 更新时间:2021年10月25日 15:22:09   作者:傻不拉几的程序员  
这篇文章主要为大家详细介绍了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++中建立一个顺序表

    如何在C++中建立一个顺序表

    在使用顺序表之前,首先创建一个空的顺序表,也就是初始化顺序表。这里,在程序中只需设置顺序表的结点数量ListLen为0即可。这样,后面需要添加的数据元素将从顺序表的第一个位置存储
    2013-10-10
  • c++实现跳跃表(Skip List)的方法示例

    c++实现跳跃表(Skip List)的方法示例

    跳表(skiplist)是一个非常优秀的数据结构,实现简单,插入、删除、查找的复杂度均为O(logN),下面这篇文章主要介绍了c++实现跳跃表(Skip List)的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-09-09
  • C语言经典例程100例(经典c程序100例)

    C语言经典例程100例(经典c程序100例)

    这篇文章主要介绍了C语言经典例程100例,经典c程序100例,学习c语言的朋友可以参考一下
    2018-03-03
  • OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 使用C语言实现扫雷游戏

    使用C语言实现扫雷游戏

    这篇文章主要为大家详细介绍了使用C语言实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Cocos2d-x UI开发之CCControlColourPicker控件类使用实例

    Cocos2d-x UI开发之CCControlColourPicker控件类使用实例

    这篇文章主要介绍了Cocos2d-x UI开发之CCControlColourPicker控件类使用实例,本文代码中包含大量注释来讲解CCControlColourPicker控件类的使用,需要的朋友可以参考下
    2014-09-09
  • 基于C语言实现简单的扫雷游戏

    基于C语言实现简单的扫雷游戏

    这篇文章主要为大家详细介绍了基于C语言实现简单的扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C++内存池的简单实现

    C++内存池的简单实现

    内存池是一种动态内存分配与管理技术。本文主要介绍了C++内存池的简单实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • vs2022启动一个CmakeLists.txt项目的实践

    vs2022启动一个CmakeLists.txt项目的实践

    本文主要介绍了vs2022启动一个CmakeLists.txt项目的实践,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • C语言中scanf与scanf_s函数的使用详解

    C语言中scanf与scanf_s函数的使用详解

    本文主要介绍了C语言中scanf与scanf_s函数的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论