` 本帖最后由 jinyi7016 于 2016-3-30 05:54 编辑
监控摄像头拍下的一般都是真彩的照片,要处理成灰度图像是进行车牌识别的第一步。
但是在ti的图像处理库中没的长到灰度的函数,好么只能自己写了。
关于灰度,也有不同的颜色深度,那么以下对256色,进行转换。 前面已对bmp文件的格式时行了大体的说明,BITMAPINFOHEADER结构体中的存成员biBitcount就是表示颜色深度的变量。
将24位真彩图片转为8位(即256色)灰度图片。 计算公式: gray = red * 0.299 + green * 0.587 + blue * 0.114
还要添加RGBQUAD结构。由上一篇可知,RGBQUAD结构有四个成员,对于8位灰度图片的RGBQUAD结构生成程度如下:
- for(i=0;i<256;i++){
- m->pColorTable[i].rgbBlue=i;
- m->pColorTable[i].rgbGreen=i;
- m->pColorTable[i].rgbRed=i;
- m->pColorTable[i].rgbReserved=0;
- }
复制代码
对于灰度计算的程序如下:
- for(i = 0; i < N ;i++)
- {
- // 原始公式
- // Gray[i] = Image[3 * i + 2] * 0.299 + Image[3 * i + 1] * 0.587 + Image[3 * i] * 0.114;
- // 8 位精度优化
- GrayBuf[i] = (Image[3 * i + 2] * 76 + Image[3 * i + 1] * 150 + Image[3 * i] * 30) >> 8;
- }
复制代码
for里的第一行是按公式进行的计算,第二行是经过优化过后的程序,将浮点进行转成了实数运行,再移位。加快了运行速度。
优化前的运行时间:
优化后的运行时间:
对于file与info两个结构体中的成员,只需要更改文件大小、数据区大小、颜色深度、数据区偏移四个数值,其他的尺寸、保留字、压缩方式、分辨率、结构体长度等等数据都是一样的。
通过上面公式计算后的数据区部分数据为:
bmp结构内容为:
通过与上一篇24位图片的对比可以发现,就是上面提到的几个参数改变了,其他的结构体成员是没有改变的。 将灰度图片在存储在PC中。 文件大小=600*450+54+1024。 数据大小:600*450=270000 结构体大小:54 RGBQUAD结构大小:256*4=1024
对于以下图片做灰度化处理:
最后是灰度化后的图片结果
最后完整的源程序与二进制文件:
`
|