本文为原创做品,转载请注明出处 算法
欢迎关注个人博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ spring
这篇博客主要是要讲怎么把一张图片存成一个二进制的文件,直接存到DSP中来作处理,而不用考虑DSP与图像采集模块,或者上位机之间的数据通讯使得咱们更加专一于算法的开发研究和处理功能的实现。 数组
这是最近在作的同样工做,主要开发对雷达图像处理的目标检测算法。思路是先把现成的雷达图片转化为一个数组,而后以头文件的形式包含到程序中。用来验证算法和计算速度。DSP采用TI公司的6000系列单核处理器,6748。(背景交代完毕,能够忽略)。 函数
在matlab中,对于size函数,其返回值为: 工具
[ROW,COL] = size(A), 测试
例如: spa
A = [0, 1 ,2; 0, 1, 2]; .net
size(A) 3d
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
具体用法:
图片:
转换窗口:
转换出来的文件:
看着好像很方便,可是好事老是多磨,不幸的是这个工具只是支持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);
转换以后的头文件:
至此转换完成。
把该头文件包含到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分清楚了,再把一维数组转化为二维数组就不会错。这时候用到我开头讲到的那个注意事项。
好了本文到此结束!欢迎有兴趣的朋友一块儿交流,批评指正!但愿个人思路能给你带来一些灵感!