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

本文爲原創做品,轉載請註明出處 算法

歡迎關注個人博客:http://blog.csdn.net/hit2015springhttp://www.cnblogs.com/xujianqing/ spring

這篇博客主要是要講怎麼把一張圖片存成一個二進制的文件,直接存到DSP中來作處理,而不用考慮DSP與圖像採集模塊,或者上位機之間的數據通訊使得咱們更加專一於算法的開發研究和處理功能的實現。 數組

這是最近在作的同樣工做,主要開發對雷達圖像處理的目標檢測算法。思路是先把現成的雷達圖片轉化爲一個數組,而後以頭文件的形式包含到程序中。用來驗證算法和計算速度。DSP採用TI公司的6000系列單核處理器,6748。(背景交代完畢,能夠忽略)。 函數

開胃小菜---MATLAB size()函數 imread()函數

在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讀取圖片相關介紹

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

 

好了本文到此結束!歡迎有興趣的朋友一塊兒交流,批評指正!但願個人思路能給你帶來一些靈感!

相關文章
相關標籤/搜索