资源简介
考查结构体、文件读写、简单的图像处理算法
从bmp文件(如灰度图像woman.bmp、彩色图像lenna.bmp)读入图像数据
对图像数据进行均衡处理
将均衡处理后的图像数据保存为新的bmp文件
要求编程只使用C语言自带库
功能
必做功能1:灰度图像的直方图均衡
必做功能2:彩色图像的直方图均衡

代码片段和文件信息
#include
#include
#include
#pragma pack(1) //取消对齐,如果不取消的话 sizeof(BITMAPFILEHEADER)就是16,而不是14
using namespace std;
typedef short int UINT16;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef long LONG;
typedef struct tagBITMAPFILEHEADER{
WORD bfType;//文件类型,必须是0x424D,即字符“BM” 这个属性必须注释掉,不然由于内存对齐的影响后面会出错
DWORD bfSize;//文件大小
WORD bfReserved1;//保留字
WORD bfReserved2;//保留字
DWORD bfOffBits;//从文件头到实际位图数据的偏移字节数
}BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;//信息头大小
LONG biWidth;//图像宽度
LONG biHeight;//图像高度
WORD biPlanes;//位平面数,必须为1
WORD biBitCount;//每像素位数
DWORD biCompression; //压缩类型
DWORD biSizeImage; //压缩图像大小字节数
LONG biXPelsPerMeter; //水平分辨率
LONG biYPelsPerMeter; //垂直分辨率
DWORD biClrUsed; //位图实际用到的色彩数
DWORD biClrImportant; //本位图中重要的色彩数
}BITMAPINFOHEADER; //位图信息头定义
typedef struct tagRGBQUAD{
BYTE rgbBlue; //该颜色的蓝色分量
BYTE rgbGreen; //该颜色的绿色分量
BYTE rgbRed; //该颜色的红色分量
BYTE rgbReserved; //保留值
}RGBQUAD;//调色板定义
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
}BITMAPINFO *LPBITMAPINFO *PBITMAPINFO;
typedef struct tagIMAGEDATA//像素信息
{
BYTE blue;
BYTE green;
BYTE red;
}IMAGEDATA;
void bmpTransform(const BITMAPINFOHEADER &bmpInfounsigned char* data)
{
int BPP = bmpInfo.biBitCount;//BPP(Bits Per Pixel)每像素的比特数
int Width = bmpInfo.biWidth;//每行的像素数
int Height = bmpInfo.biHeight;
int RowSize = 4*(BPP*Width/32);//每行的字节数
int channels = BPP/8;//每个像素字节数也就是几个颜色通道
for(int start = 0; start < channels; start++){
int C[255] = {0};
double P[255] = {0}Q[255] = {0};//灰度图
for(int i = 0; i < Height; i++){
for(int j = start; j < RowSize; j += channels){//idx为递增量
unsigned char k = data[RowSize*i+j];//我这里改成unsigned int都会出错不知道为什么别人的没错
C[k]++;
}
}
//P
for(int i = 0; i < 255; i++) P[i] = (double)C[i]/(Width*Height);
//Q
Q[0] = P[0];
for(int i = 1; i < 255; i++) Q[i] = Q[i-1] + P[i];
//dataX
for(int i = 0; i < Height; i++){
for(int j = start; j < RowSize; j += channels){//idx为递增量
unsigned char k = data[RowSize*i+j];
data[RowSize*i+j] = round(255*Q[k]);
}
}
}
}
int main(int argc char* argv[])
{
int a = sizeof(BITMAPFILEHEADER);
BITMAPFILEHEADER bmpFile;
BITMAPINFOHEADER bmpInfo;
RGBQUAD* colorTable;
string inFileName;
string outFileName;
switch(argc){
case 1:
cout << “File name of the image to be processed:“;
cin >> inFileName;
outFileName = string(inFileName).insert(inFileName.find(“.“)“_eq“);//insert会改变原string,这里先拷贝一份后进行insert
break;
case 2:
inFileName = argv[1];//ar
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2019-03-06 23:30 2018C语言大作业_图像直方图均衡算法的实现\
文件 1727074 2018-12-21 16:03 2018C语言大作业_图像直方图均衡算法的实现\2018C语言大作业_图像直方图均衡算法的实现.pptx
文件 786486 2008-05-31 22:36 2018C语言大作业_图像直方图均衡算法的实现\lenna.bmp
文件 66614 2018-12-15 17:31 2018C语言大作业_图像直方图均衡算法的实现\woman.bmp
目录 0 2019-03-06 23:30 2018C语言大作业_图像直方图均衡算法的实现\项目文件\
目录 0 2019-03-06 23:30 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\
文件 17 2019-02-03 21:44 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\1.bin
目录 0 2019-03-06 23:30 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\bin\
目录 0 2019-03-06 23:30 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\bin\Debug\
文件 1962696 2019-02-11 16:30 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\bin\Debug\bmp_img.exe
文件 66614 2019-02-11 16:32 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\bin\Debug\woman.bmp
文件 1071 2019-02-03 21:20 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\bmp_img.cbp
文件 124 2019-02-11 16:29 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\bmp_img.depend
文件 361 2019-02-11 16:34 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\bmp_img.layout
文件 786486 2008-05-31 22:36 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\lenna.bmp
文件 6372 2019-02-11 16:30 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\main.cpp
目录 0 2019-03-06 23:30 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\obj\
目录 0 2019-03-06 23:30 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\obj\Debug\
文件 45512 2019-02-11 16:30 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\obj\Debug\main.o
目录 0 2019-03-06 23:30 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\test\
文件 1860 2019-02-10 19:03 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\test\1.cpp
文件 400281 2019-02-10 19:03 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\test\1.exe
文件 5682 2019-02-10 21:16 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\test\2.cpp
文件 66614 2019-02-10 21:08 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\test\imhist.bmp
文件 66614 2018-12-15 17:31 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\test\woman.bmp
文件 14 2019-02-03 22:00 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\TEST.$$$
文件 786486 2019-02-11 16:03 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\test.bmp
文件 66614 2018-12-15 17:31 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\woman.bmp
文件 66614 2019-02-11 16:32 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\woman2.bmp
文件 66614 2019-02-11 16:30 2018C语言大作业_图像直方图均衡算法的实现\项目文件\bmp_img\woman_eq.bmp
- 上一篇:最简单的c++播放音乐源代码
- 下一篇:C++并行程序设计
相关资源
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
- 二维码生成BMP
评论
共有 条评论