图像转换为二维数组存入DSP6748



本文为原创作品,转载请注明出处

欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/

这篇博客主要是要讲怎么把一张图片存成一个二进制的文件,直接存到DSP中来做处理,而不用考虑DSP与图像采集模块,或者上位机之间的数据通信使得我们更加专注于算法的开发研究和处理功能的实现。

这是最近在做的一样工作,主要开发对雷达图像处理的目标检测算法。思路是先把现成的雷达图片转化为一个数组,然后以头文件的形式包含到程序中。用来验证算法和计算速度。DSP采用TI公司的6000系列单核处理器,6748。(背景交代完毕,可以忽略)。

开胃小菜---MATLAB size()函数 imread()函数

在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读取图片相关介绍

在对DSP6748进行图像处理算法开发时,你可以利用fopen(),fread()函数,在CCS集成开发环境下,直接读取上位机中指定路径下的文件,但是这必须是在Debug模式下,通过仿真器进行链接才能实现。

在仿真模式下,通过仿真器读取上位机中的一张图片,需要耗费很长时间。因此为了算法调试的速度和需要,我把图片转化为一个头文件包含到程序中,这也是通常的做法。

图片转换为字符数组形式

TI提供的转换工具

TI公司提供了一个转换的小工具,在C6748_StarterWare包中,具体路径为:..\C6748_StarterWare_1_20_04_01\tools\bmp2c

具体用法:

  1. 把要转化的图片拷贝到该工具tools\bmp2c目录下
  2. 在该目录下,按住shift按键,鼠标右键—【在此处打开命令窗口】
  3. 输入命令:bmp2c -8 InPutName.bmp OutPutName.c
  4. 自动生成字符数组文件
    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分清楚了,再把一维数组转化为二维数组就不会错。这时候用到我开头讲到的那个注意事项。

好了本文到此结束!欢迎有兴趣的朋友一起交流,批评指正!希望我的思路能给你带来一些灵感!



时间: 2024-10-31 14:55:16

图像转换为二维数组存入DSP6748的相关文章

将List转换为二维数组(result)

result的数据结构为List<Map<String,Object>> //将List转换为二维数组String[][] String[][] z = new String[result.size()][]; for(int i=0;i<z.length;i++){ Map m = (Map)result.get(i); Set set = m.keySet(); z[i] = new String[m.size()]; Iterator it =set.iterator(

echarts中key-value形式的dataset source值转换为二维数组形式的dataset source值

在echarts的数据来源选型时,我在二维数组.对象数组两种形式中出现优于,看上去对象数组语义化挺好,但二维数组可以直接在echarts的各种例子里直接用,为了兼顾两个的长处,写了对象数组与二维数组的转换方法,代码如下(最外层花括号用于方便直接才控制台输出而不污染控制台环境): { // 原始key-value形式的objArr let objArr=[ {product: 'Matcha Latte', count: 823, score: 95.8}, {product: 'Milk Tea

静态初始化一个二维数组并将二维数组排序并输出

基本思想:将二维数组存入到一个新的一维数组中,将一维数组排序后,再加以格式控制输出 class work03 { public static void main(String[] args) { int a[][]={ {11,15,32,21},{2,3},{4,6,5}}; int length=0; int k=0; for(int i=0;i<a.length;i++){ for(int j=0;j<a[i].length;j++){ length++;//求二维数组元素个数 } k+

***php解析JSON二维数组字符串

客户端的请求体中的数据:[{"msg_id": 1, "msg_status": "HAS_READ" }, { "msg_id": 2, "msg_status": "HAS_READ" }] 是一个二维数组字符串 $json_data = json_decode($GLOBALS['HTTP_RAW_POST_DATA'], true);其实用这一句即可实现JSON二维数组字符串转P

稀疏数组的经典应用(二维数组与稀疏数组的相互转换)

package com.zhangwl.数据结构.稀疏数组; /** * @ClassName SparseArray * @Description 棋盘游戏演示 * @Author zhangwl * @Date 2019/10/10 22:54 * @Version 1.0 **/public class SparseArray { public static void main(String[] args) { /*创建一个原始的二维数组11 * 11 ,0:表示没有棋子 :1:表示黑子:

树转二维数组的方法

需求如下: let arr = [ { code: "A001", level: 1, childs: [ { code: "A002", level: 2, childs: [ { code: "A005", level: 3, childs: [] }, { code: "A006", level: 3, childs: [] } ] }, { code: "A003", level: 2, child

44.从键盘输入12个数存入二维数组a[3][4]中,编写程序求出最大元素的值及它所在的行号和列号

//1.建立二维数组 //2.运用循环,将内容输入到数组中 //3.求出最大元素,并输出行号和列号 #include<iostream> using namespace std; int main() { int a[3][4]; int Max=0;//赋值之前需要先置为0 cout<<"please input 12 numbers: "<<endl; for(int i=0;i<3;i++)//嵌套循环,用于向二维数组中输入内容 { fo

Java读取excel指定sheet中的各行数据,存入二维数组,包括首行,并打印

1. 读取 //读取excel指定sheet中的各行数据,存入二维数组,包括首行 public static String[][] getSheetData(XSSFSheet sheet) throws IOException { String[][] testArray = new String[sheet.getPhysicalNumberOfRows()][]; for(int rowId =0;rowId<sheet.getPhysicalNumberOfRows();rowId++)

Ajax传递二维数组至后台ThinkPHP控制器

最近为单位做了专家库的小程序,没个专家有擅长的领域,这是通过一个checkbox来提交和编辑的.因为不想刷新页面,使用Ajax异步传输. 首先从专业数据表中读取所有的专业,并且生成checkbox: $(document).ready(function(){ $.ajax({ type:"POST", url:"http://localhost/yibu/index.php/Home/Expertadd/expertecho",//对应控制器读取专业列表 succe