《基于DSP的圖像處理dsp課程設計》由會員分享,可在線閱讀,更多相關《基于DSP的圖像處理dsp課程設計(14頁珍藏版)》請在裝配圖網上搜索。
1、河海大學計算機與信息學院——DSP課程設計報告
《基于DSP的圖像處理》
DSP課程設計報告
學 號:
班 級:
姓 名:
同組姓名:
指導教師:
2012年9月13日
目 錄
1課程設計目的………………………………………………1
2課程設計題目背景描述和要求……………………………1
3課程設計報告內容…
2、………………………………………1
4總結…………………………………………………………4
5參考文獻……………………………………………………4
6附錄…………………………………………………………5
1.課程設計目的
利用TMS320C54X實驗板實現以下功能:1、求圖像的平均灰度值;2、利用四個LED小燈進行指示四個等級的灰度值;3、根據圖像灰度等級對圖像進行不同的變換(水平翻轉、豎直翻轉等);4、對圖像進行二值化處理,包括全局二值化和局部二值化兩種處理方式;5、對圖像進行反色處理。
2.課程設計題目背景描述和要求
圖像處理主要是指對原始圖像進行加工,使其具有更好的
3、視覺效果或滿足某些特定場合的應用要求。由于圖像具有信息量大、某些場合下對實時性要求較高的特點,所以對處理芯片的運算速度有較高要求。DSP芯片具有運算速度快,數據吞吐率高等優(yōu)點,故在圖像處理中得到廣泛應用。
本課題利用TMS320C54X系列的DSP芯片進行圖像處理,實現對圖像的讀入、分析、翻轉、二值化及反色等處理。
3.課程設計報告內容
3.1 圖像的讀入及分析
數字圖像處理(Digital Image Processing)又稱為計算機圖像處理,它是指利用計算機和其它高速、大規(guī)模集成數字硬件,對從圖像信息轉換來的數字電信號進行某些數字運算或處理,以期提高圖像的質量或達到人們所預想的結
4、果。
輸出用戶所需圖像
DSP硬件平臺
原始圖像
圖像處理算法
數字圖像處理中常將圖像像素點的灰度分為256個等級,其中0為黑色,255為白色,0到255之間的等級灰度逐漸減小。
圖像是由若干像素組成,每個像素都有確定的灰度值。所以一幅圖像,可以用每一個像素點的位置及其灰度值來描述。以此為依據,對于二維圖像,我們采用了一個二維數組,每個數組元素存儲一個像素點的信息,數組元素標號可以表示像素點的橫縱坐標,數組元素的值就為像素點的灰度值。通過這種方法,我們就可以將整張圖像的信息讀入DSP存儲空間中。
圖像讀入后,根據每一個像素點的灰度值可以計算出整張圖像的
5、平均灰度值。根據這一平均值我們將圖像分為四個等級:0~63為0級,64~127為1級,128~191為2級,192~255為3級。
圖像分級完成后,結果通過實驗板上LP0~LP4四個LED小燈進行指示,每個等級對應一個小燈,某一個燈亮即表示圖像平均灰度處于該級。
3.2 圖像的二值化處理
3.2.1二值化處理
一幅圖像包括目標物體、背景和噪聲。目標物體和背景等在灰度值上有明顯差異。因此,為了從多值的數字圖像中直接提取目標物體,常設定一灰度閾值T,將圖像分為兩個部分,灰度大于T的像素群及灰度小于T的像素群。上述就是二值化處理的方法。
本課設中設計了兩種二值化方式:全局二值化,局部二
6、值化。
3.2.2全局二值化
根據確定的二值化閾值T,我們對以讀入的圖像進行處理,對于圖像中所有像素點,灰度值大于T的,將其灰度設為255,;灰度值小于T的,將其灰度值設為0。這樣實現了圖像的全局二值化。
全局二值化為這張圖像設定了統(tǒng)一的二值化閾值,但實際圖像的各個部分平均灰度狀況并不統(tǒng)一。因此全局二值化在表現圖像細節(jié)方面存在缺陷。
3.2.3局部二值化
利用3.1中介紹的灰度分級,利用已經得到的圖像整體的灰度等級,為每級的圖像設定一個二值化閾值T。0級的灰度在0~63之間,閾值T設為32;1級的灰度在64~127之間,閾值T設為96;2級的灰度在128~191之間,閾T設為16
7、0;3級灰度在192~255之間,閾值T設為224。
該方法首先將圖像劃分為若干子集,在根據各子集的灰度狀況各自設定二值化閾值。
為簡化處理過程,本課設中實際將圖像劃分為四個大小相等部分。再后逐一計算每個部分的平均灰度值,以此作為二值化閾值。隨后根據各部分自身閾值,分別進行二值化處理。最后再將處理后的各部分進行整合,得到處理后的圖像。
以上方法相對于全局二值化有一定改善,但仍有缺陷。它將圖像劃分為若干小部分,各個部分閾值選取為自身的灰度平均值,因此,對各個部分而言,實質上還是選取了一個統(tǒng)一閾值。對此,可通過優(yōu)化各部分閾值計算方法來進一步改善效果。
優(yōu)化的閾值計算方式應當更多地依賴于各部
8、分圖像自身的特征,以求所得的閾值能更好地反映該部分的情況。一種具體優(yōu)化方法是:根據各部分像素灰度值的平均值E,像素之間的差平方P,像素之間的均方根值Q等各種局部特征,設定一個參數方程進行閾值的計算。例如:T=a*E+b*P+c*Q,其中a,b,c是自由參數。這樣得出來的二值化圖像就更能表現出二值化圖像中的細節(jié)。
3.3 翻轉和反色處理
翻轉也是圖像處理中常用的處理方式。如3.1中所說,本課設中將圖像讀入后是用一個二維數組進行存儲的,因此數字圖像實質上可以看作是一個矩陣,圖像的翻轉也就可以當做是矩陣的翻轉進行處理。
根據3.1中已得的圖像分級情況,我們對圖像進行了不同的翻轉處理。0級和
9、1級進行水平翻轉,通過對二維數組同行元素進行左右調換實現;2計和3級進行豎直翻轉,通過對二維數組同列元素進行上下調換實現。
通過對二維數組元素的各種位置變換,均可以得到多種圖像的翻轉變換或局部翻轉變換。
反色處理則是對3.2中已得二值化處理后的圖像進行的一種處理。二值化處理后的圖像將目標對象和背景等進行了明確的區(qū)分,其中之一為白色,則另一個必為黑色。而其中具體是目標對象為白,背景為黑,還是這好相反,則是由圖像本身特性決定的。假如我們期望以白色標記目標對象,而二值化結果卻正好相反時,就可以采用反色處理。
二值化處理后圖像所有像素點均只有黑白兩種顏色。將其中黑色的變?yōu)榘咨?,也即灰度值?變?yōu)?/p>
10、255;同時白色變?yōu)楹谏?,也即灰度值?55變?yōu)?,便實現了圖像的反色處理。
4.總結
通過本次課程設計,將課堂教學的知識應用于實踐。在這個過程中,我們先對圖像的知識進行基本的了解,并且將圖像轉化為數組進行存儲,處理。我們還學習了ccs軟件的基本應用,這對于我們以后的工作也是非常重要的。同時通過這次實踐進一步提高了我們的c語言水平。最重要的是對我們思維的開拓,從開始的數組化圖像到后來局部二值化的想法,通過向老師提問,網上查找資料等方式我們一步一步完善我們的課程設計,最終完成了我們的課設目的。
另外,通過本次實踐,我們也感受到了dsp技術的穩(wěn)定性好,可重復性好,抗干擾能力強,數據壓縮等
11、特點。相信這項技術在以后有更大的發(fā)展空間。
參考文獻
[1] 戴明楨,周建江. TMS320C54x DSP[M]. 北京:北京航空航天大學出版社,2007.
[2] 郎崇林 DSP及其在圖像處理中的應用[J]. 科技情報開發(fā)與經濟, 2011,第26期
[3] 百度百科 二值化
附錄
1、 源程序1:
#include "math.h"
#include "stdio.h"
extern void leda();
extern void ledb();
extern void ledc();
extern void ledd();
#define
12、 IMAGE_WIDTH 64
#define IMAGE_HEIGTH 64
int level;
void average(int (*y)[64])
{
unsigned int ai,aj;
unsigned long temp=0;
float aver;
for(ai=0;ai<=63;ai++)
for(aj=0;aj<=63;aj++)
{
temp+=*(*(y+ai)+aj);
}
//level=(int)(temp/(64l*64l*64l));
aver=temp/(6
13、4u*64u);
level=(int)(aver/64);
}
void leddis()
{
switch(level)
{
case 0:leda();break;
case 1:ledb();break;
case 2:ledc();break;
case 3:ledd();break;
default:break;
}
}
void convert(int (*y)[64])
{
int ci,cj,tempc,c=64/2
14、;
switch(level)
{
case 0:{}
case 1: //水平翻轉
for (ci=0; ci<64; ci++)
{
for (cj=0; cj
15、; ci++)
{
for (cj=0; cj<64; cj++)
{
tempc=y[ci][cj];
y[ci][cj]=y[63-ci][cj];
y[63-ci][cj]=tempc;
}
}
break;
default:break;
}
}
main()
{
FILE *fi;
int i,j;
int y[IMAGE_HEIGTH][IMAGE_WIDTH];
unsigned char id[64];
int k[4]={32,96,160,224
16、}; /*k is Threshold Value,以各段均值為閾值*/
fi=fopen("D:\\set41.bmp","rb");
for (i=0; i<=16; i++)
{
fread((char *)id,sizeof(char),IMAGE_WIDTH,fi);
}
// fread((char *)id,sizeof(char),54,fi);
for (i=0; i
17、 for (j=0; j
18、=0; j
19、 ret
_ledb:
stm #02h,ar1 ;define the address
portw *ar1,01h
nop
nop
ret
_ledc:
stm #04h,ar1 ;define the address
portw *ar1,01h
nop
nop
ret
_ledd:
stm #08h,ar1 ;define the address
portw *ar1,01h
nop
nop
ret
3、 局部二值
20、化處理原程序:
#include "math.h"
#include "stdio.h"
int y[64][64];
int ave(int (*t)[32])
{
unsigned int ai,aj;
unsigned long temp=0;
float aver;
for(ai=0;ai<=31;ai++)
for(aj=0;aj<=31;aj++)
{
temp+=*(*(t+ai)+aj);
}
aver=temp/(32u*32u);
return aver;
21、 //以各區(qū)域平均值為二值化閾值
}
void locate()
{
int lex[4],i,j;
int x1[32][32],x2[32][32],x3[32][32],x4[32][32];
for(i=0;i<32;i++)
for(j=0;j<32;j++)
{
x1[i][j]=y[i][j];
x2[i][j]=y[i][j+32];
x3[i][j]=y[i+32][j];
x
22、4[i][j]=y[i+32][j+32];
}
lex[0]=ave(x1);
lex[1]=ave(x2);
lex[2]=ave(x3);
lex[3]=ave(x4);
i=0;
for (i=0; i<32; i++)
{
for (j=0; j<32; j++)
{
x1[i][j] = 255*((255-x1[i][j])/lex[0]);
x2[i][j] = 255*((255-x2[i][j])/lex[1]);
x3[i]
23、[j] = 255*((255-x3[i][j])/lex[2]);
x4[i][j] = 255*((255-x4[i][j])/lex[3]);
}
}
for(i=0;i<32;i++)
for(j=0;j<32;j++)
{
y[i][j]=x1[i][j];
y[i][j+32]=x2[i][j];
y[i+32][j]=x3[i][j];
y[i+32][j+32]=x4[i][j];
}
}
main(
24、)
{
FILE *fi;
int i,j;
unsigned char id[64];
fi=fopen("D:\\set64.bmp","rb");
for (i=0; i<=16; i++)
{
fread((char *)id,sizeof(char),64,fi);
}
// fread((char *)id,sizeof(char),54,fi);
for (i=0; i<64; i++)
{
fread((char *)id,sizeof(char),64,fi);
for (j=0; j<64; j++)
{
y[i][j]=id[j];
}
}
fclose(fi);
i=0;
locate();
i=0;
}
12