圖像轉換爲二維數組存入DSP6748



版權聲明:本文爲博主原創文章,未經博主允許不得轉載。博客不用於商業活動,博主對博客的使用,擁有最終解釋權 
本文爲原創作品,未經本人同意,禁止轉載,禁止用於商業用途!本人對博客使用擁有最終解釋權 
歡迎關注我的網上圖書室:[晨鳧追風]和 微信公衆號:青春當追風


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

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

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

matlab中,對於size函數,其返回值爲:

[ROWCOL] = 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爲列數


正如上圖所示,把widthheight分清楚了,再把一維數組轉化爲二維數組就不會錯。這時候用到我開頭講到的那個注意事項。

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章