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

实验结果:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenCV-Python直方图均衡化实现图像去雾

    直方图均衡化 直方图均衡化的目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均衡的图像.这种均衡化,即实现了灰度值统计上的概率均衡,也实现了人类视觉系统上(HSV)的视觉均衡. 一般来说,直方图均衡化可以达到增强图像显示效果的目的.最常用的比如去雾.下面,我们来分别实现灰度图像去雾以及彩色图像去雾. 实现灰度图像去雾 在OpenCV中,它提供了函数cv2.equalizeHist()来实现直方图均衡化,该函数的完整定义如下: def equalizeHist(src, d

  • python数字图像处理实现直方图与均衡化

    在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histogram(image,nbins=256) 在numpy包中,也提供了一个计算直方图的函数histogram(),两者大同小义. 返回一个tuple(hist, bins_center), 前一个数组是直方图的统计量,后一个数组是每个bin的中间值 import numpy as np from s

  • 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*

  • C语言实现BMP图像处理(彩色图转灰度图)

    我们知道真彩图不带调色板,每个象素用 3 个字节,表示 R.G.B 三个分量.所以处理很简单,根据 R.G.B 的值求出 Y 值后,将 R.G.B 值都赋值成 Y,写入新图即可. 在YUV 的颜色表示方法中,Y 分量的物理含义就是亮度,它含了灰度图(grayscale)的所有信息,只用 Y 分量就完全能够表示出一幅灰度图来.YUV 和RGB 之间有着如下的对应关系: 再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的彩色变成灰度,形成新调色板,而位

  • C语言实现BMP图像处理(哈夫曼编码)

    哈夫曼(Huffman)编码是一种常用的压缩编码方法,是 Huffman 于 1952 年为压缩文本文件建立的.它的基本原理是频繁使用的数据用较短的代码代替,较少使用的数据用较长的代码代替,每个数据的代码各不相同.这些代码都是二进制码,且码的长度是可变的. 下面给出具体的 Huffman 编码算法: (1) 首先统计出每个符号出现的频率,上例 S0 到 S7 的出现频率分别为 4/14,3/14,2/14,1/14,1/14,1/14,1/14,1/14. (2) 从左到右把上述频率按从小到大的

  • C语言数字图像处理之直方图均衡化

    本文实例为大家分享了C语言直方图均衡化的具体代码,供大家参考,具体内容如下 原理 直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等.这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果. 直方图是表示数字图像中每一灰度出现频率的统计关系.直方图能给出图像灰度范围.每个

  • C语言实现直方图均衡化

    直方图均衡化部分是用c语言写的,最后用opencv显示原图像,处理后图像以及原图和处理后图的灰度直方图. 虽然做出来了,均衡化效果还可以,但不知道为什么处理后图像中有三条白线,真心搞不懂,有看出来问题的大神麻烦留言告诉我,谢谢. (终于知道哪出问题了,原来是每行字节数求错了,改为LineByte=(width*8/8+3)/4*4;即可.) 下面是代码: #include "stdafx.h" #include<stdio.h> #include<windows.h&

  • C语言实现BMP图像的读写功能

    C语言实现BMP图像的读写 对于刚接触数字图像的同学,应该都有一个疑问,如何把一个BMP格式的图像用纯C语言读入呢,我相信这也是数字图像处理的第一步,如果有幸看到这篇文档,我就有幸的成为你数字图像处理路上的第一盏明灯! 了解BMP的构成 这就是BMP图像的理论知识,有个大概的了解就行,最主要的是从理论到实践!!! 废话不多说,直接上干货. 代码 定义头文件为"bmp.h",定义read_bmp函数为读函数,write_bmp函数为写函数 读bmp图 #include <stdli

  • Python OpenCV直方图均衡化详解

    目录 前言 灰度直方图均衡化 颜色直方图均衡化 前言 图像处理技术是计算机视觉项目的核心,通常是计算机视觉项目中的关键工具,可以使用它们来完成各种计算机视觉任务.在本文中,将介绍如何使用 OpenCV 函数 cv2.equalizeHist() 执行直方图均衡,并将其应用于灰度和彩色图像,cv2.equalizeHist() 函数将亮度归一化并提高图像的对比度. 灰度直方图均衡化 使用 cv2.equalizeHist() 函数来均衡给定灰度图像的对比度: # 加载图像并转换为灰度图像 imag

  • OpenCV 直方图均衡化的实现原理解析

    目录 直方图均衡化介绍 图像的直方图是什么? 更形象解释 什么是直方图均衡化? 直方图均衡化是如何实现的? 直方图均衡化的作用 直方图均衡化步骤 相关API equalizeHist 代码示例 灰度图均值化 彩色图均值化 直方图均衡化介绍 图像的直方图是什么? 图像直方图,是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图-直方图.直方图反映了图像灰度的分布情况.是图像的统计学特征. 简单来说:直方图是图像中像素强度分布的图形表达方式,它统计了每

  • Python学习之直方图均衡化原理详解

    目录 1.点算子 2.线性灰度变换 3.直方图均衡化 4.代码实战 1.点算子 点算子是两个像素灰度值间的映射关系,属于像素的逐点运算,相邻像素不参与运算.点算子是最简单的图像处理手段,如:亮度调整.对比度调整.颜色变换.直方图均衡化等等. 2.线性灰度变换 线性灰度变换表达为: 其中rk.sk分别为输入.输出点像素灰度值. ▲图2.1 线性灰度变换 当a>1时,输出图像像素灰度范围扩大,图像对比度增强,当a<1时反之.这是因为人眼不易区分相近的灰度值,因此若图像灰度值范围较小,观感上细节不够

  • C语言实现BMP转换JPG的方法

    本文实例讲述了C语言实现BMP转换JPG的方法.分享给大家供大家参考.具体实现方法如下: /**************************************************************************** 名称: jpeg.c 功能: linux下bmp转化为jpeg程序源代码 日期: 2010.01.26 注意: 编译时加"-ljpeg"(gcc -o bmp2jpg jpeg.c -ljpeg) ***********************

随机推荐