标签:
本文为原创作品,转载请注明出处
欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/
这篇博客主要是要讲怎么把一张图片存成一个二进制的文件,直接存到DSP中来做处理,而不用考虑DSP与图像采集模块,或者上位机之间的数据通信使得我们更加专注于算法的开发研究和处理功能的实现。
这是最近在做的一样工作,主要开发对雷达图像处理的目标检测算法。思路是先把现成的雷达图片转化为一个数组,然后以头文件的形式包含到程序中。用来验证算法和计算速度。DSP采用TI公司的6000系列单核处理器,6748。(背景交代完毕,可以忽略)。
在matlab中,对于size函数,其返回值为:
[ROW,COL] = size(A),
例如:
A = [0, 1 ,2; 0, 1, 2]; size(A)
ans =
2 3
此处A为两行三列的矩阵
在读取一张图片之后,(此处默认为灰度图)返回一个矩阵,行数和列数则分别对应于图像的高度和宽度,
str1 = 'C:\Users\yezi\Desktop\dsp处理\'; str2 = '111.bmp'; str3 = strcat(str1,str2); image = imread(str3);
在matlab中读一张在指定路径下的图片,matlab已经提供了一个imread()函数,它返回数字图片每一点像素的灰度值,存成一个矩阵image。
行数——高度
列数——宽度
图片高度宽度怎么看?
在图片上【右键】—【属性】—【详细信息】
在Opencv中同样提供一个imread函数,读取一个图片,并存为一个Mat类的对象。也是包含一个图像矩阵,行数列数与matlab是一样的。
把图片存成一个一维数组,然后在DSP中要把它恢复成一个二维矩阵,于是行数列数就显得相当重要。正是对这个函数的理解,解决了我在DSP中读取图片时把行数,列数搞混后出现错误,先记住它。
在对DSP6748进行图像处理算法开发时,你可以利用fopen(),fread()函数,在CCS集成开发环境下,直接读取上位机中指定路径下的文件,但是这必须是在Debug模式下,通过仿真器进行链接才能实现。
在仿真模式下,通过仿真器读取上位机中的一张图片,需要耗费很长时间。因此为了算法调试的速度和需要,我把图片转化为一个头文件包含到程序中,这也是通常的做法。
TI公司提供了一个转换的小工具,在C6748_StarterWare包中,具体路径为:..\C6748_StarterWare_1_20_04_01\tools\bmp2c
具体用法:
把要转化的图片拷贝到该工具tools\bmp2c目录下
在该目录下,按住shift按键,鼠标右键—【在此处打开命令窗口】
输入命令:bmp2c -8 InPutName.bmp OutPutName.c
自动生成字符数组文件 OutPutName.c
图片:
转换窗口:
转换出来的文件:
看着好像很方便,但是好事总是多磨,不幸的是这个工具只是支持24位深度和16位深度的图片,而我所需要的却是要把一幅8位的图片,就是灰度图转化为字符数组文件,于是自己动手丰衣足食:
再上我编写的matlab的代码:
%%读入灰度图像,转化为二进制文件,即一个一维数组 clear clc [RGB,map]=imread('gray1234.bmp');%读入需要转化的图片,图片和m文件一个路径下 H=RGB; I1=double(H); [M,N]=size(I1); information12 = '#ifndef IMAGE_H_\n' information13 = '#define IMAGE_H_\n\n\n\n\n' fid=fopen('image.h','wt'); %在当前目录下创建一个文件写入数据 fprintf(fid,information12); fprintf(fid,information13); fprintf(fid,'const unsigned char image[] = {\n');%写数组名 n=0; for i=1:M %fprintf(fid,'{'); for j=1:N %写数据 n=n+1; fprintf(fid,'0x%x',I1(i,j)); if (j ~= N ) || (i ~= M ); fprintf(fid,','); end end fprintf(fid,'\n'); end fprintf(fid,'};\n'); fprintf(fid,'#endif /* IMAGE_H_ */'); fclose(fid);
因为MATLAB可以支持好多种图片格式的读取,所以只要把图片后缀名变换,该工具就可以支持多种格式的图片!!!但是是转换灰度图,其实是一个二维数组,但是可以按照上面的思路,稍微修改代码,便可以转出rgb的三维数组。
代码下载地址:点击打开链接
转换之后的头文件:
至此转换完成。
把该头文件包含到CCS工程中,就可以直接对图片进行处理了。
在CCS中的主函数测试代码:
void main() { int i ; int j; for(i = 0; i < height; i++) { for (j = 0; j < width; ++j) { BA[i][j] = image[i * width + j]; } }
BA为把该图片一维数组重新转为二维数组。要注意其中height为行数,width为列数
正如上图所示,把width和height分清楚了,再把一维数组转化为二维数组就不会错。这时候用到我开头讲到的那个注意事项。
好了本文到此结束!欢迎有兴趣的朋友一起交流,批评指正!希望我的思路能给你带来一些灵感!
标签:
原文地址:http://blog.csdn.net/hit2015spring/article/details/51348122