C++简易的图像处理系统程序+流程图
本系统支持将24位的bmp位图中的某色彩转化为另一目标色彩,可以将打开的位图进行色彩分析,在用户设置的参数下对位图进行颜色变换,由于时间仓促仅实现了这一功能,如果有兴趣还可以实现诸如转黑白,提取轮廓,模糊等等操作,后面将略谈一些。
8.2程序执行的结果:
原图:24位BMP
进行转化,将黑色转化位白色:
结果图:
9.3概要设计
本程设计思路:
本系统的功能主要通过CbitmapProcess类来处理,要实现色彩的转化主要分3步,首先要加载BMP文件,通过LoadBmp(char* filename)来实现,它打开BMP文件,读取BMP文件的信息头,将一些主要的表示图片属性的信息保存,并读取图像的色彩信息,保存至一个缓冲区类以待处理,读取BMP图像的函数中实现了对8位,16位,24位BMP图像的读取,但在处理图像时仅针对24位和16位进行了处理,一方面8位位图使用调色板来索引颜色,数据中储存的的是索引值,保存方式稍有不同;更重要的它最多能表示256种颜色,效果不佳,使用范围不是很大,所以感兴趣的话可以参照读取方式来编写相应的函数;回到24位的图像它由红,绿。蓝3色组成,各占8bit,可以表示256*256*256种色彩,色彩转化很简单,只需要遍历色彩缓冲区,将等于源色彩的值改为目标色彩值,24位色彩每隔3byte为一个颜色,16位色彩每隔2位为一个色彩(565方式),修改完后,创建一个新的BMP文件,写入信原文请找腾讯752018766辣,文-论'文.网http://www.751com.cn 息头,及色彩信息便可。
转化为黑白图也不难,只需要将各色彩映射到0—255的亮度范围即可,可以将3个原色看做坐标系的3个轴,分别将其投影到距3轴等距的正第一象限的那个轴上即可,保存颜色,保存文件。
提取轮廓:就是找图像中与周围色彩边缘的差异较大得点,及颜色梯度,设置一个门限,颜色梯度大于这个门限的颜色转化位白色,小于的转化位黑色;计算颜色梯度有很多算法,大家可以网上查看。
模糊其实就是通过一个过滤器对颜色进行混合,如盒滤波器即将每个颜色与其周围的颜色相加并平均来达到平滑图像的目的。
还有很多的效果有兴趣可以去看看。
最后还有就是还可以编写加载其他格式图片的函数实现支持多种格式,只要提取其颜色信息并保存起来就可以任意处理了。
程序流程图(如左图):
略
9.3 详细设计与编码:
见上传程序。
9.4调试分析:
调试中发现BMP图像信息是倒叙储存的,这需要我们在加载后进行一次颠倒,见:
FlipBmp函数,要尤其小心防止转化中信息的丢失或错位,还有就是我发现在处理大图片时。速度很慢,原因是对每次发现要转化的色彩时都要写入目的色,这很浪费时间,我们可以对于连续的写入目的色,可以记录下起始地址和结束地址,最后一次性的写入,节约了写操作的时间,这对于大面积的连续的转化要更快些(如将全白的图片变为全黑),而对一些零散的颜色转化要不是很好,还有很多方法如使用SSE指令等等在汇编级别的优化,这里就不说了。
9.5 用户使用说明:
输入源图片地址和保存图片的路径,选择好源色彩和目标色彩,就可以转化了;
9.6设计心得:
这个试验本质是对文件的操作,在对文件格式的理解下我们能对其进行所需的操作,
加强了我对文件操作的理解。1812