数字图像处理课的第一次实验,主要是对BMP图像的处理,并且学习熟悉excel可视化实验数据
实验环境
- 建立动态库工程,录入HXLBMPFILE类,建立相应动态库,将整个类作为动态库输出 (HXLBMPFILE类的定义和相关函数代码老师已经给了,自己敲一遍生成动态库就可以用了)
- 建立控制台程序工程,录入 main 函数,调用 HXLBMPFILE动态库,并调试
实验要求
- 提交自己编写的 main.cpp文件。包括反白函数、改调色板函数、彩色变灰度函数、保存txt文件函数等
- 提交在excel中显示的bmp.txt数据图像(至少三张)
实验内容
- 主函数
#include "stdio.h"
#include "hxlbmpfile.h"
#include<stdio.h>
void reverse(HXLBMPFILE bmpfile, char path[]);//反白函数
void palette(HXLBMPFILE bmpfile, char path[]);//修改调色板函数
void rgbtogray(HXLBMPFILE bmpfile, char path[]);//彩色图像变灰度图像函数
int main(int argc, char* argv[])
{
HXLBMPFILE bmpfile;
int i, j;
char path[] = "imagepath";//图像路径
if (!bmpfile.LoadBMPFILE(path)) return 1; //加载图像
//在此添加各函数对图像进行处理
printf("program ends!\n");
return 0;
}
- 反白函数
void reverse(HXLBMPFILE bmpfile, char path[])
{
int i, j;
if (bmpfile.iYRGBnum == 1)//灰度图像反白
{
for (i = 0; i < bmpfile.imageh; i++)
for (j = 0; j < bmpfile.imagew; j++)
{
bmpfile.pDataAt(i)[j] = 255 - bmpfile.pDataAt(i)[j];
}
}
else//彩色图像反白
{
for (i = 0; i < bmpfile.imageh; i++)
for (j = 0; j < bmpfile.imagew; j++)
{
bmpfile.pDataAt(i, 0)[j] = 255 - bmpfile.pDataAt(i, 0)[j];
bmpfile.pDataAt(i, 1)[j] = 255 - bmpfile.pDataAt(i, 1)[j];
bmpfile.pDataAt(i, 2)[j] = 255 - bmpfile.pDataAt(i, 2)[j];
}
}
bmpfile.SaveBMPFILE(path);
}
看一下效果
- 更改调色板函数
void palette(HXLBMPFILE bmpfile, char path[])
{
int i;
for (i = 0; i < 255; i++)//数值随意改变
{
(bmpfile.palette + i)->rgbBlue = i;
(bmpfile.palette + i)->rgbGreen = i * 2;
(bmpfile.palette + i)->rgbRed = i * 3;
}
bmpfile.SaveBMPFILE(path);
}
- 彩色图像变灰度图像
void rgbtogray(HXLBMPFILE bmpfile, char path[])
{
int i, j;
HXLBMPFILE bf;
bf.imagew = bmpfile.imagew;
bf.imageh = bmpfile.imageh;
bf.iYRGBnum = 1;//转为灰度图像,最关键的一步
bf.AllocateMem();
for (i = 0; i < bmpfile.imageh; i++)
for (j = 0; j < bmpfile.imagew; j++)
{
bf.pDataAt(i)[j] = int((float)bmpfile.pDataAt(i, 0)[j] * 0.114 + (float)bmpfile.pDataAt(i, 1)[j] * 0.587 + (float)bmpfile.pDataAt(i, 2)[j] * 0.299); //记得转成int型
}
bf.SaveBMPFILE(path);
}
- 将图像数据写入txt文件
int main(int argc, char* argv[])
{
int i, j;
FILE *h;
HXLBMPFILE bmpfile;
char path[] = "imagepath";//图像路径
if (!bmpfile.LoadBMPFILE(path)) return 1;
char filename[] = "txtpath";//txt文件路径
h = fopen(filename,"r+b");
if (h == NULL)return false;
//写入想得到的数据,例如这里写入的是一副灰度图像的各灰度值
for (int i = 0; i < bmpfile.imageh; i++) //按行写入
{
for (int j = 0; j < bmpfile.imagew; j++)
{
fprintf(h, "%4d ", bmpfile.pDataAt(i)[j]);
}
fprintf(h, "\n"); //按行写入
}
fclose(h);
printf("program ends!\n");
return 0;
}
- excel可视化
- 色阶可视化图像
将图像各灰度值导出到txt文件,然后用excel打开txt文件,调节条件格式里的色阶即可,原理就是根据单元格的数值填充相应颜色,将界面缩到最小后即可呈现图像
- 也可利用折线图展现图像灰度直方图
将灰度图像各灰度值频率信息写入txt文件,根据对应灰度值生成直方图
- 色阶可视化图像