DSP技術實習報告

一 、實習題目

1、 灰度線性變換

2、 灰度的對數變換

3、 鋸齒波變換

4、 圖像剪取

二 、實習目的

1、 鞏固和深化數字圖像處理技術所涉及的數理基礎、基本算法和各種圖像處理技術方法,學習和掌握圖像變換。

2、 對學習圖像處理的基礎知識對其套用工程實踐有一定的認識,提高學生對套用軟體的使用能力。

3、 通過理論聯繫實際,綜合運用所學知識,提高學生獨立分析和解決實際問題的能力,增強學生的工程意識,打好專業基礎

三、實習要求:

1、能夠根據設計題目要求查閱檢索有關的文獻資料,結合題目選學有關參考書;

2、熟悉計算機圖像處理的設計方法;

3、熟悉圖像灰度變換程式的設計方法;

4、掌握圖像灰度變換的仿真方法;

5、完成圖像的灰度變換。

四、系統原理描述:

灰度變換將輸入圖像映射為輸出圖像,輸出圖像每個像素點的灰度值僅由對應的輸入像素點的值決定。它常用於改變圖像的灰度範圍及分布,是圖像數位化及圖像顯示的重要工具。灰度變換因其作用性質有時也被稱為對比度增強、對比度拉伸或點運算,稱之為灰度變換。

灰度變換實際上是灰度到灰度的映射過程。設輸入圖像為A(x,y)輸出圖像為B(x,y),則灰度變換可表示為:

即灰度變換完全由灰度映射函式決定。顯然灰度變換不會改變圖像內像素點之間的空間關係。

1. 灰度線性變換

設圖像灰度值f(x,y)的可能值域為D,但在一定條件下,使得其取值範圍縮小為且如圖 7-11所示,這種狀態常出現於連續圖f(x,y)值的動態範圍小,或攝影曝光不足中,因而其對應的直方圖P (D)如圖所示,集中於某個較小的灰度區間內。但是通常人們希望灰度直方圖在全部灰度區域內均勻分布,最簡單地是把低反差圖像進行灰度變換得到高反差圖像,即線性變換,如下式:

該式可以使變換後的灰度的取值範圍擴大到

一般來說,只有當兩個相鄰像素的灰度值(亮度值)相差到一定程度時,人的視覺才能分辨。若灰度值D僅在較小區間內時,則人眼可分辨的亮度差的總級數則亦很少,從而造成目標圖像灰度值與背景灰度值相接近,人眼而無法分辨檢出。而對其進行的變換後,則如上圖可使變得更大,從而使得視覺上對變換後圖像能夠分辨的亮度差的總級數增加,造成目標圖像與背景間亮度差異的加大,使原先無法被人眼檢出的目標圖像也能檢出,且變換後圖像清晰度也大大提高。

2. 灰度的對數變換

對數變換常用來擴展低值灰度,而壓縮高值灰度,這樣可以使低值灰度的圖像細節更容易看清楚,對數變換的表達式為:

其中K為一根據圖像內容來確定的常數因子。

3. 鋸齒波變換

這種方法常用來在動態範圍較小的顯示器上顯示動態範圍較大的圖像,或者用來發現圖像中基本輪廓,變換曲線如圖所示。

4. 圖像剪取

對於灰度圖像f,設定一個閾值t,若f(i,j) t,則f(i,j)的值保持不變。處理後的圖像仍然是灰度圖像,只不過閾值t以下的像素被置0。

五、方案論證及系統設計

六、系統程式的設計

1、灰度線性變換

#include

#include

#include "imagelib.h"

//添加圖像和視頻處理庫頭檔案

#include "imagesample.h"

//添加圖像例子頭檔案,

//包含原始的圖像檔案goldhill[128][128]

#define MAX_PIXEL_VALUE 256

//包含原始圖像像素的最大灰度值

#define WIDTH 128

#define HEIGHT 128

//原始圖像行和列的像素數

int my_result[256];

//保存自編函式得到的灰度圖結果的數組

short histogram_output[256];

//保存調用庫函式得到的灰度圖結果的數組

short my_threshold_val=175;

//short my_threshold_val=127;

//閾值的設定

void my_histogram;

//聲明自編灰度圖算法顯示函式

void main( )

{

int i;

int my_size;

short *input;

my_size = WIDTH*HEIGHT;

//計算所有像素點數

input = &goldhill[0][0];

//獲取原始圖像的首地址

for(i= 0;i< MAX_PIXEL_VALUE;i++) histogram_output[i]= 0;

IMG_histogram(input,histogram_output,my_size);

//調用image.lib庫函式實現灰度圖顯示

my_histogram;

//自編C語言算法程式實現灰度圖顯示

IMG_threshold( &goldhill[0][0],&goldhill[0][0],WIDTH ,HEIGHT, my_threshold_val );

//調用image.lib庫函式實現閾值處理與顯示

while(1);

}

void my_histogram

{

int za=10,zb=235,i,j,z1=0,z2=255,zzba;

short (*p)[128];

//定義了一個指針變數p,

//指向了一個包含128個元素的一維數組,

//即行指針變數p

p=goldhill;

zzba=(z2-z1)/(float)(zb-za);

//獲取原始圖像的首地址

// for(i=0;i<256;i++) my_result[i]=0;

for (i=0;i<128;i++)

{ for (j=0;j<128;j++)

{

if(*(*(p+i)+j)<=za)*(*(p+i)+j)=z1;

else{

if(*(*(p+i)+j)>=zb)*(*(p+i)+j)=z2;

else *(*(p+i)+j)=zzba*(*(*(p+i)+j)-za)+z1+0.5;

}

// k=*(*(p+i)+j);

// my_result[k]++;

}

}

//自編灰度直方圖算法顯示函式

}

2、灰度的對數變換

#include

#include

#include "imagelib.h"

//添加圖像和視頻處理庫頭檔案

#include "imagesample.h"

//添加圖像例子頭檔案,

//包含原始的圖像檔案goldhill[128][128]

#define MAX_PIXEL_VALUE 256

//包含原始圖像像素的最大灰度值

#define WIDTH 128

#define HEIGHT 128

#define ZERO 0

//原始圖像行和列的像素數

int my_result[256];

//保存自編函式得到的灰度直方圖結果的數組

short histogram_output[256];

//保存調用庫函式得到的灰度直方圖結果的數組

short my_threshold_val=175;

//short my_threshold_val=127;

//閾值的設定

void my_histogram;

//聲明自編灰度直方圖算法顯示函式

void main( )

{

int i;

int my_size;

short *input;

my_size = WIDTH*HEIGHT;

//計算所有像素點數

input = &goldhill[0][0];

//獲取原始圖像的首地址

for(i= 0;i< MAX_PIXEL_VALUE;i++) histogram_output[i]= 0;

IMG_histogram(input,histogram_output,my_size);

//調用image.lib庫函式實現灰度直方圖顯示

my_histogram;

//自編C語言算法程式實現灰度直方圖顯示

IMG_threshold( &goldhill[0][0],&goldhill[0][0],WIDTH ,HEIGHT, my_threshold_val );

//調用image.lib庫函式實現閾值處理與顯示

while(1);

}

void my_histogram

{

int i,j;

double za=2,zb=128,z1=0,z2=255,fij,gij,zzlba;

short (*p)[128];

//定義了一個指針變數p,

//指向了一個包含128個元素的一維數組,

//即行指針變數p

p=goldhill;

zzlba=(z2-z1)/(double)(log(zb)-log(za));

//獲取原始圖像的首地址

// for(i=0;i<256;i++) my_result[i]=0;

//初始化灰度直方圖結果數組

for (i=0;i<128;i++)

{ for (j=0;j<128;j++)

/* log transform.*/

{

fij=*(*(p+i)+j);

if(fij==0)fij=0.001;

gij=zzlba*(log(fij)-log(za))+z1;

*(*(p+i)+j)=gij+0.5;

}

}

// k=*(*(p+i)+j);

// my_result[k]++;

}

3、鋸齒波變換

#include

#include

#include "imagelib.h"

//添加圖像和視頻處理庫頭檔案

#include "imagesample.h"

//添加圖像例子頭檔案,

//包含原始的圖像檔案goldhill[128][128]

#define MAX_PIXEL_VALUE 256

//包含原始圖像像素的最大灰度值

#define WIDTH 128

#define HEIGHT 128

//原始圖像行和列的像素數

int my_result[256];

//保存自編函式得到的灰度直方圖結果的數組

short histogram_output[256];

//保存調用庫函式得到的灰度直方圖結果的數組

short my_threshold_val=175;

//short my_threshold_val=127;

//閾值的設定

void my_histogram;

//聲明自編灰度直方圖算法顯示函式

void main( )

{

int i;

int my_size;

short *input;

my_size = WIDTH*HEIGHT;

//計算所有像素點數

input = &goldhill[0][0];

//獲取原始圖像的首地址

for(i= 0;i< MAX_PIXEL_VALUE;i++) histogram_output[i]= 0;

IMG_histogram(input,histogram_output,my_size);

//調用image.lib庫函式實現灰度直方圖顯示

my_histogram;

//自編C語言算法程式實現灰度直方圖顯示

IMG_threshold(&goldhill[0][0],&goldhill[0][0],WIDTH,HEIGHT, my_threshold_val );

//調用image.lib庫函式實現閾值處理與顯示

while(1);

}

void my_histogram

{

int i,j;

float lwidth=128,ratio=128,gg=235;

short (*p)[128];

//定義了一個指針變數p,

//指向了一個包含128個元素的一維數組,

//即行指針變數p

p=goldhill;

//獲取原始圖像的首地址

// for(i=0;i<256;i++) my_result[i]=0;

//初始化灰度直方圖結果數組

for (i=0;i<128;i++)

{ for (j=0;j<128;j++)

{

gg=*(*(p+i)+j);

while(gg>lwidth) gg=gg-lwidth;

*(*(p+i)+j)=gg*ratio+0.5;

}

// k=*(*(p+i)+j);

// my_result[k]++;

}

//自編灰度直方圖算法顯示函式

}

4、圖像剪取

#include

#include

#include "imagelib.h"

//添加圖像和視頻處理庫頭檔案

#include "imagesample.h"

//添加圖像例子頭檔案,

//包含原始的圖像檔案goldhill[128][128]

#define MAX_PIXEL_VALUE 256

//包含原始圖像像素的最大灰度值

#define WIDTH 128

#define HEIGHT 128

//原始圖像行和列的像素數

#define ZERO 0

int my_result[256];

//保存自編函式得到的灰度直方圖結果的數組

short histogram_output[256];

//保存調用庫函式得到的灰度直方圖結果的數組

short my_threshold_val=175;

//short my_threshold_val=127;

//閾值的設定

void my_histogram;

//聲明自編灰度直方圖算法顯示函式

void main( )

{

int i;

int my_size;

short *input;

my_size = WIDTH*HEIGHT;

//計算所有像素點數

input = &goldhill[0][0];

//獲取原始圖像的首地址

for(i= 0;i< MAX_PIXEL_VALUE;i++) histogram_output[i]= 0;

IMG_histogram(input,histogram_output,my_size);

//調用image.lib庫函式實現灰度直方圖顯示

my_histogram;

//自編C語言算法程式實現灰度直方圖顯示

IMG_threshold(&goldhill[0][0],&goldhill[0][0],WIDTH,HEIGHT,my_threshold_val );

//調用image.lib庫函式實現閾值處理與顯示

while(1);

} void my_histogram

{

int i,j,threshold=0;

short (*p)[128];

//定義了一個指針變數p,

//指向了一個包含128個元素的一維數組,

//即行指針變數p

p=goldhill;

//獲取原始圖像的首地址

// for(i=0;i<256;i++) my_result[i]=0;

//初始化灰度結果數組

for (i=0;i<128;i++)

{ for (j=0;j<128;j++)

{

*(*(p+i)+j)=(*(*(p+i)+j)

// k=*(*(p+i)+j);

// my_result[k]++;

}

}

//自編灰度算法顯示函式

}

七、調試方法及性能分析與實驗

通過灰度線性變換程式將一副圖像進行線性處理,線性變換後得到的圖像如圖(一)。通過灰度對數變換程式將圖像進行對數處理,得到對數變換後的圖像如圖(二)。通過鋸齒波程式將圖像進行處理 ,得到處理後的圖像如圖(三)。通過圖像剪取程式將圖像進行處理,得到處理後的圖像如圖(四)。

圖一 線性變換

圖二 對數變換

圖三 鋸齒波變換

圖四 圖像剪取

八、實習總結

基於CCS圖像處理程式調試與設計主要是在C語言的環境下與圖象處理的基本算法相結合。從調出圖象到編寫C程式的圖象處理算法,最後到輸出處理後的圖象,形成一個一體化的模式,從而達到圖象處理的套用效果。通過算法和具體程式的結合,從而達到我們所要的結果。

九、實習體會:

經過兩周的實習,我在書本中,上課時學習的知識得到了靈活運用,尤其通過對於變換前後的圖像對比,我更清楚地看到各種處理方法對於圖像的作用,本次實驗也讓我對CCS軟體有了更多的了解和認識,為進一步學習數圖知識打下了良好的基礎。

十、參考文獻

1.TMS320C55x DSP原理及套用 汪春梅 孫洪波 編著 電子工業出版社

2..DSP原理與套用實驗 姜陽 周錫青 張雪英 編著 西安電子科技大學出版社