《基于DSP的圖像處理dsp課程設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《基于DSP的圖像處理dsp課程設(shè)計(14頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、河海大學(xué)計算機(jī)與信息學(xué)院——DSP課程設(shè)計報告
《基于DSP的圖像處理》
DSP課程設(shè)計報告
學(xué) 號:
班 級:
姓 名:
同組姓名:
指導(dǎo)教師:
2012年9月13日
目 錄
1課程設(shè)計目的………………………………………………1
2課程設(shè)計題目背景描述和要求……………………………1
3課程設(shè)計報告內(nèi)容…
2、………………………………………1
4總結(jié)…………………………………………………………4
5參考文獻(xiàn)……………………………………………………4
6附錄…………………………………………………………5
1.課程設(shè)計目的
利用TMS320C54X實驗板實現(xiàn)以下功能:1、求圖像的平均灰度值;2、利用四個LED小燈進(jìn)行指示四個等級的灰度值;3、根據(jù)圖像灰度等級對圖像進(jìn)行不同的變換(水平翻轉(zhuǎn)、豎直翻轉(zhuǎn)等);4、對圖像進(jìn)行二值化處理,包括全局二值化和局部二值化兩種處理方式;5、對圖像進(jìn)行反色處理。
2.課程設(shè)計題目背景描述和要求
圖像處理主要是指對原始圖像進(jìn)行加工,使其具有更好的
3、視覺效果或滿足某些特定場合的應(yīng)用要求。由于圖像具有信息量大、某些場合下對實時性要求較高的特點,所以對處理芯片的運(yùn)算速度有較高要求。DSP芯片具有運(yùn)算速度快,數(shù)據(jù)吞吐率高等優(yōu)點,故在圖像處理中得到廣泛應(yīng)用。
本課題利用TMS320C54X系列的DSP芯片進(jìn)行圖像處理,實現(xiàn)對圖像的讀入、分析、翻轉(zhuǎn)、二值化及反色等處理。
3.課程設(shè)計報告內(nèi)容
3.1 圖像的讀入及分析
數(shù)字圖像處理(Digital Image Processing)又稱為計算機(jī)圖像處理,它是指利用計算機(jī)和其它高速、大規(guī)模集成數(shù)字硬件,對從圖像信息轉(zhuǎn)換來的數(shù)字電信號進(jìn)行某些數(shù)字運(yùn)算或處理,以期提高圖像的質(zhì)量或達(dá)到人們所預(yù)想的結(jié)
4、果。
輸出用戶所需圖像
DSP硬件平臺
原始圖像
圖像處理算法
數(shù)字圖像處理中常將圖像像素點的灰度分為256個等級,其中0為黑色,255為白色,0到255之間的等級灰度逐漸減小。
圖像是由若干像素組成,每個像素都有確定的灰度值。所以一幅圖像,可以用每一個像素點的位置及其灰度值來描述。以此為依據(jù),對于二維圖像,我們采用了一個二維數(shù)組,每個數(shù)組元素存儲一個像素點的信息,數(shù)組元素標(biāo)號可以表示像素點的橫縱坐標(biāo),數(shù)組元素的值就為像素點的灰度值。通過這種方法,我們就可以將整張圖像的信息讀入DSP存儲空間中。
圖像讀入后,根據(jù)每一個像素點的灰度值可以計算出整張圖像的
5、平均灰度值。根據(jù)這一平均值我們將圖像分為四個等級:0~63為0級,64~127為1級,128~191為2級,192~255為3級。
圖像分級完成后,結(jié)果通過實驗板上LP0~LP4四個LED小燈進(jìn)行指示,每個等級對應(yīng)一個小燈,某一個燈亮即表示圖像平均灰度處于該級。
3.2 圖像的二值化處理
3.2.1二值化處理
一幅圖像包括目標(biāo)物體、背景和噪聲。目標(biāo)物體和背景等在灰度值上有明顯差異。因此,為了從多值的數(shù)字圖像中直接提取目標(biāo)物體,常設(shè)定一灰度閾值T,將圖像分為兩個部分,灰度大于T的像素群及灰度小于T的像素群。上述就是二值化處理的方法。
本課設(shè)中設(shè)計了兩種二值化方式:全局二值化,局部二
6、值化。
3.2.2全局二值化
根據(jù)確定的二值化閾值T,我們對以讀入的圖像進(jìn)行處理,對于圖像中所有像素點,灰度值大于T的,將其灰度設(shè)為255,;灰度值小于T的,將其灰度值設(shè)為0。這樣實現(xiàn)了圖像的全局二值化。
全局二值化為這張圖像設(shè)定了統(tǒng)一的二值化閾值,但實際圖像的各個部分平均灰度狀況并不統(tǒng)一。因此全局二值化在表現(xiàn)圖像細(xì)節(jié)方面存在缺陷。
3.2.3局部二值化
利用3.1中介紹的灰度分級,利用已經(jīng)得到的圖像整體的灰度等級,為每級的圖像設(shè)定一個二值化閾值T。0級的灰度在0~63之間,閾值T設(shè)為32;1級的灰度在64~127之間,閾值T設(shè)為96;2級的灰度在128~191之間,閾T設(shè)為16
7、0;3級灰度在192~255之間,閾值T設(shè)為224。
該方法首先將圖像劃分為若干子集,在根據(jù)各子集的灰度狀況各自設(shè)定二值化閾值。
為簡化處理過程,本課設(shè)中實際將圖像劃分為四個大小相等部分。再后逐一計算每個部分的平均灰度值,以此作為二值化閾值。隨后根據(jù)各部分自身閾值,分別進(jìn)行二值化處理。最后再將處理后的各部分進(jìn)行整合,得到處理后的圖像。
以上方法相對于全局二值化有一定改善,但仍有缺陷。它將圖像劃分為若干小部分,各個部分閾值選取為自身的灰度平均值,因此,對各個部分而言,實質(zhì)上還是選取了一個統(tǒng)一閾值。對此,可通過優(yōu)化各部分閾值計算方法來進(jìn)一步改善效果。
優(yōu)化的閾值計算方式應(yīng)當(dāng)更多地依賴于各部
8、分圖像自身的特征,以求所得的閾值能更好地反映該部分的情況。一種具體優(yōu)化方法是:根據(jù)各部分像素灰度值的平均值E,像素之間的差平方P,像素之間的均方根值Q等各種局部特征,設(shè)定一個參數(shù)方程進(jìn)行閾值的計算。例如:T=a*E+b*P+c*Q,其中a,b,c是自由參數(shù)。這樣得出來的二值化圖像就更能表現(xiàn)出二值化圖像中的細(xì)節(jié)。
3.3 翻轉(zhuǎn)和反色處理
翻轉(zhuǎn)也是圖像處理中常用的處理方式。如3.1中所說,本課設(shè)中將圖像讀入后是用一個二維數(shù)組進(jìn)行存儲的,因此數(shù)字圖像實質(zhì)上可以看作是一個矩陣,圖像的翻轉(zhuǎn)也就可以當(dāng)做是矩陣的翻轉(zhuǎn)進(jìn)行處理。
根據(jù)3.1中已得的圖像分級情況,我們對圖像進(jìn)行了不同的翻轉(zhuǎn)處理。0級和
9、1級進(jìn)行水平翻轉(zhuǎn),通過對二維數(shù)組同行元素進(jìn)行左右調(diào)換實現(xiàn);2計和3級進(jìn)行豎直翻轉(zhuǎn),通過對二維數(shù)組同列元素進(jìn)行上下調(diào)換實現(xiàn)。
通過對二維數(shù)組元素的各種位置變換,均可以得到多種圖像的翻轉(zhuǎn)變換或局部翻轉(zhuǎn)變換。
反色處理則是對3.2中已得二值化處理后的圖像進(jìn)行的一種處理。二值化處理后的圖像將目標(biāo)對象和背景等進(jìn)行了明確的區(qū)分,其中之一為白色,則另一個必為黑色。而其中具體是目標(biāo)對象為白,背景為黑,還是這好相反,則是由圖像本身特性決定的。假如我們期望以白色標(biāo)記目標(biāo)對象,而二值化結(jié)果卻正好相反時,就可以采用反色處理。
二值化處理后圖像所有像素點均只有黑白兩種顏色。將其中黑色的變?yōu)榘咨布椿叶戎祻?變?yōu)?/p>
10、255;同時白色變?yōu)楹谏?,也即灰度值?55變?yōu)?,便實現(xiàn)了圖像的反色處理。
4.總結(jié)
通過本次課程設(shè)計,將課堂教學(xué)的知識應(yīng)用于實踐。在這個過程中,我們先對圖像的知識進(jìn)行基本的了解,并且將圖像轉(zhuǎn)化為數(shù)組進(jìn)行存儲,處理。我們還學(xué)習(xí)了ccs軟件的基本應(yīng)用,這對于我們以后的工作也是非常重要的。同時通過這次實踐進(jìn)一步提高了我們的c語言水平。最重要的是對我們思維的開拓,從開始的數(shù)組化圖像到后來局部二值化的想法,通過向老師提問,網(wǎng)上查找資料等方式我們一步一步完善我們的課程設(shè)計,最終完成了我們的課設(shè)目的。
另外,通過本次實踐,我們也感受到了dsp技術(shù)的穩(wěn)定性好,可重復(fù)性好,抗干擾能力強(qiáng),數(shù)據(jù)壓縮等
11、特點。相信這項技術(shù)在以后有更大的發(fā)展空間。
參考文獻(xiàn)
[1] 戴明楨,周建江. TMS320C54x DSP[M]. 北京:北京航空航天大學(xué)出版社,2007.
[2] 郎崇林 DSP及其在圖像處理中的應(yīng)用[J]. 科技情報開發(fā)與經(jīng)濟(jì), 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: //水平翻轉(zhuǎn)
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