数字图像处理——对图像进行反白、更改调色板信息、彩色图像变灰度、将图像数据保存于txt文件

数字图像处理课的第一次实验,主要是对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文件,根据对应灰度值生成直方图在这里插入图片描述

参考

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值