圖像轉換為二進制文件存入DSP6748


本文為原創作品,轉載請注明出處

歡迎關注我的博客:http://blog.csdn.net/hit2015springhttp://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);

 

 

轉換之后的頭文件:

 

 

至此轉換完成。

把該頭文件包含到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分清楚了,再把一維數組轉化為二維數組就不會錯。這時候用到我開頭講到的那個注意事項。

 

好了本文到此結束!歡迎有興趣的朋友一起交流,批評指正!希望我的思路能給你帶來一些靈感!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM