DSP实习报告模板.docx
《DSP实习报告模板.docx》由会员分享,可在线阅读,更多相关《DSP实习报告模板.docx(23页珍藏版)》请在冰点文库上搜索。
![DSP实习报告模板.docx](https://file1.bingdoc.com/fileroot1/2023-6/8/d875d1a9-32f6-43e4-b1fc-a5a345fa80f7/d875d1a9-32f6-43e4-b1fc-a5a345fa80f71.gif)
DSP实习报告模板
DSP应用技术实习报告
课程课题:
基于DSP的键盘控制数字图像处理方式及LCD显示
专业班级:
电子信息科学与技术
学生姓名:
指导教师:
邹修国李林徐友杨红兵
完成时间:
一、课程内容:
✧掌握直方图统计的原理和程序设计
✧了解边缘检测的算法和用途
✧了解锐化的算法和用途
✧了解取反的算法和用途
✧掌握直方图均衡化增强的原理和程序设计
✧了解液晶显示器的显示控制原理及编程方法
✧了解键盘的使用原理及编程方法
二、设计功能及工作原理
能够实现功能:
✓数字图像直方图统计
✓数字图像边缘检测(Sobel算子)
✓数字图像的锐化(LAPLACE算子)
✓数字图像的取反
✓数字图像直方图均衡化增强
通过键盘的输入可以控制图像处理的方式,并且LCD显示何种处理方式。
工作原理:
◆灰度直方图是灰度值的函数,描述的是图像中具有该灰度值的像素的个数,其横坐标表示像素的灰度级别,纵坐标表示的是该灰度出现的频率。
◆边缘检测算子检查每个像素的邻域并对灰度变化率进行量化,也包括方向的确定。
大多数使用基于方向导数掩模求卷积的方法。
◆图像的锐化处理就是使模糊的图像变得更加清晰起来,拉普拉斯锐化法属于常用的一种微分锐化方法。
◆求反处理的图像与原来的图像黑白颠倒,取得类似照片底片的效果。
◆直方图增强的方法就是压缩直方图中比例少的像素所占用的灰度范围,多出来的灰度空间按照统计比例分配给直方图中比例高的像素使用。
三、设计过程
1.各种功能工程的分别建立:
✓数字图像直方图统计
✓数字图像边缘检测(Sobel算子)
✓数字图像的锐化(LAPLACE算子)
✓数字图像的取反
✓数字图像直方图均衡化增强
✓键盘输入
✓液晶显示器控制显示
2.将各个功能模块进行组合:
1)打开键盘输入的工程文件,浏览key.c文件内容;
2)打开数字图像直方图统计的工程文件,将Histo.c主函数内的处理部分的代码复制到key.c文件的case1语句后;
3)打开数字图像边缘检测的工程文件,将Image.c主函数内的处理不放入内的代码复制到key.c文件的case2语句后;
4)打开数字图像锐化的工程文件,将Image.c主函数内的处理不放入内的代码复制到key.c文件的case3语句后;
5)打开数字图像取反的工程文件,将Image.c主函数内的处理不放入内的代码复制到key.c文件的case4语句后;
6)打开数字图像直方图均衡化增强的工程文件,将Histo.c主函数内的处理不放入内的代码复制到key.c文件的case5语句后;
7)内存空间的修改,打开cmd代码,做以下修改
-w
-stack1000
-heap1000
-sysstack1000
-lrts55x.lib
以及DARAM2:
o=0x8100,l=0x30000
8)打开液晶显示的工程文件,利用字模显示工具分别对所需要显示的字进行字模显示,得到扫描代码,对原有工程文件主函数进行修改,再对key,c的主函数进行添加和修改。
9)编译并下载程序
10)打开观察窗口
进行窗口设各项参数设置,分别打开三个,一个用于原图显示,一个用于直方图显示,一个用于处理后图像显示。
进行断点调试,观察图像变化,以及LCD显示。
3.主要的代码
◆主函数
main()
{
intdbScanCode,i;
PLL_Init(20);
SDRAM_init();
InitCTR();
TurnOnLCD();//打开显示
LCDCLS();//清除显示内存
CTRLCDCMDR=LCDCMDSTARTLINE;//设置显示起始行
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for(;;)
{
CTRLCDCMDR=LCDCMDPAGE;//设置操作页=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDVERADDRESS;//起始列=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
dbScanCode=GetKey();
dbScanCode&=0x0ff;
if(dbScanCode==SCANCODE_9)break;
switch(dbScanCode)
{
case1:
CTRLR=0x1;
CTRLR=0x40;
for(i=0;i<50;i++)
{
CTRLCDRCR=ledkey[1][i];//屏幕左侧第1至8行第i列赋值port8002=0;//(赋值后当前操作列自动加1,所以不需设置)
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
Delay(512);
InitImage(MODEGRAYBAR,dbImage,IMAGEWIDTH,IMAGEHEIGHT);
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
InitImage(MODEGRAY,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
InitImage(MODEPHOTO1,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
InitImage(MODEPHOTO2,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
InitImage(MODEPHOTO3,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
InitImage(MODEPHOTO4,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
break;
case2:
CTRLR=0x2;
CTRLR=0x40;
for(i=0;i<50;i++)
{
CTRLCDRCR=ledkey[2][i];//屏幕左侧第1至8行第i列赋值port8002=0;//(赋值后当前操作列自动加1,所以不需设置)
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
Delay(512);
InitImage(MODEGRAYBAR,dbImage,IMAGEWIDTH,IMAGEHEIGHT);
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEGRAY,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO1,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO2,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO3,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO4,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
break;
case3:
CTRLR=0x4;
CTRLR=0x40;
for(i=0;i<50;i++)
{
CTRLCDRCR=ledkey[3][i];//屏幕左侧第1至8行第i列赋值port8002=0;//(赋值后当前操作列自动加1,所以不需设置)
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
Delay(512);
InitImage(MODEGRAYBAR,dbImage,IMAGEWIDTH,IMAGEHEIGHT);
Laplace(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEGRAY,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Laplace(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO1,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Laplace(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO2,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Laplace(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO3,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Laplace(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO4,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Laplace(IMAGEWIDTH,IMAGEHEIGHT);
break;
case4:
CTRLR=0x0;
CTRLR=0x48;
for(i=0;i<50;i++)
{
CTRLCDRCR=ledkey[4][i];//屏幕左侧第1至8行第i列赋值port8002=0;//(赋值后当前操作列自动加1,所以不需设置)
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
Delay(512);
InitImage(MODEGRAYBAR,dbImage,IMAGEWIDTH,IMAGEHEIGHT);
Reverse(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEGRAY,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Reverse(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO1,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Reverse(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO2,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Reverse(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO3,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Reverse(IMAGEWIDTH,IMAGEHEIGHT);
InitImage(MODEPHOTO4,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Reverse(IMAGEWIDTH,IMAGEHEIGHT);
break;
case5:
CTRLR=0x0;
CTRLR=0x50;
for(i=0;i<50;i++)
{
CTRLCDRCR=ledkey[5][i];//屏幕左侧第1至8行第i列赋值port8002=0;//(赋值后当前操作列自动加1,所以不需设置)
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
Delay(512);
InitImage(MODEGRAYBAR,dbImage,IMAGEWIDTH,IMAGEHEIGHT);
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
Enhance(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram,fHistogram1);
Histogram(dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram1);
InitImage(MODEGRAY,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
Enhance(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram,fHistogram1);
Histogram(dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram1);
InitImage(MODEPHOTO1,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
Enhance(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram,fHistogram1);
Histogram(dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram1);
InitImage(MODEPHOTO2,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
Enhance(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram,fHistogram1);
Histogram(dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram1);
InitImage(MODEPHOTO3,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
Enhance(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram,fHistogram1);
Histogram(dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram1);
InitImage(MODEPHOTO4,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
Enhance(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram,fHistogram1);
Histogram(dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram1);
while
(1);
break;
case6:
for(i=0;i<50;i++)
{
CTRLCDRCR=ledkey[6][i];//屏幕左侧第1至8行第i列赋值port8002=0;//(赋值后当前操作列自动加1,所以不需设置)
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
Delay(512);
CTRLR=0x0;
CTRLR=0x60;
break;
case7:
for(i=0;i<50;i++)
{
CTRLCDRCR=ledkey[7][i];//屏幕左侧第1至8行第i列赋值port8002=0;//(赋值后当前操作列自动加1,所以不需设置)
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
Delay(512);
CTRLR=0x8;
CTRLR=0x40;
break;
case8:
for(i=0;i<50;i++)
{
CTRLCDRCR=ledkey[8][i];//屏幕左侧第1至8行第i列赋值port8002=0;//(赋值后当前操作列自动加1,所以不需设置)
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
Delay(512);
CTRLR=0x10;
CTRLR=0x40;
break;
}
Delay(16);
}
CloseCTR();
exit(0);
}
voidHistogram(unsignedchar*pImage,intnWidth,intnHeight,floatfHisto[256])
{
inti,j;
unsignedintuWork;
unsignedchar*pWork;
for(i=0;i<256;i++)fHisto[i]=0.0f;
pWork=pImage;
for(i=0;i{
for(j=0;j{
uWork=(unsignedint)(*pWork);
fHisto[uWork]++;
}
}
uWork=nWidth*nHeight;
for(i=0;i<256;i++)
{
fHisto[i]/=uWork;
fHisto[i]*=100;
}
}
voidEnhance(unsignedchar*pImage,unsignedchar*pImage1,intnWidth,intnHeight,floatfHisto[256],floatfHisto1[256])
{
inti,j;
unsignedintuWork;
unsignedchar*pWork,*pWork1;
for(i=0;i<256;i++)
fHisto1[i]=fHisto[i]/100;
for(i=1;i<256;i++)
fHisto1[i]+=fHisto1[i-1];
for(i=0;i<256;i++)
lut[i]=fHisto1[i]*256;
for(i=0;i<256;i++)
if(lut[i]>=256)
lut[i]=255;
pWork=pImage;pWork1=pImage1;
for(i=0;ifor(j=0;j(*pWork1)=lut[(*pWork)];
}
◆字显示部分的修改代码
unsignedcharledkey[10][50]=
{
{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},//0
{0xFC,0x00,0x20,0x00,0x20,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0xFC,0x00,0x84,0x00,0x00,0x00,0x4C,0x00,0x92,0x00,0x92,0x00,0x64,0x00,0x00,0x00,0x04,0x00,0x