一、实验名称:数字滤波
二、实验目的:
- 通过工程中常用的数字滤波编程实现,验培养学生分析问题、解决问题能力。
- 通过该编程,进一步巩固和强化学生ARM汇编编程的能力。
三、实验原理:
(1)中值滤波
数字图像在其形成、传输记录的过程中往往会受到很多噪声的的污染,比如:椒盐噪声、高斯噪声等,为了抑制和消除这些随即产生的噪声而改善图像的质量,就需要去、对图像进行去滤波噪处理。
中值滤波是图像平滑的一种方法 它是一种非线性平滑滤波技术,在一定条件下可以克服线性滤波带来的图像细节的模糊问题,特别是针对被椒盐噪声污染的图像。中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。此外,中值滤波的算法比较简单,也易于用硬件实现。所以,中值滤波方法一经提出后,便在数字信号处理领得到重要的应用。
中值滤波方法:对一个数字信号序列xj(-∞<j<∞)进行滤波处理时,首先要定义一个长度为奇数的L长窗口,L=2N+1,N为正整数。设在某一个时刻,窗口内的信号样本为x(i-N),…,x(i),…,x(i+N),其中x(i)为位于窗口中心的信号样本值。对这L个信号样本值按从小到大的顺序排列后,其中值,在i处的样值,便定义为中值滤波的输出值。
(2)均值滤波
均值滤波也用于图像处理,均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=∑f(x,y)/m m为该模板中包含当前像素在内的像素总个数。
本事实验要求,将 N 个无符号数进行排序,去掉最大值和最小值,剩余的数求平均值,平均值即为本次滤波所得的结果。
四、实验要求
(1)中值滤波及编程实验,要求如下:
- 关于 N(N为奇数)个数的值在程序中能任意、方便设置,并且放在 R0 中;
- 原始数据放在内存 0X40000000 开始的地址空间;
- 中值滤波的结果放在寄存器 R1 中;
(2)均值滤波编程实验,要求如下:
- 关于 N(N为偶数)个数的值在程序中能任意、方便设置,如 4、6、10、18 等,该值放在 R0 中;
- 原始数据放在内存中 0X40000000 开始的地址空间;
- 均值滤波的结果放在寄存器 R1 中;
五、实验器材(设备、元器件):
1.PC机一台;
2.Keil MDK-ARM uVision4开发工具。
六、实验步骤:
1.打开Keil MDK-ARM uVision4开发工具;
2.新建一个工程文件;
3.在新建的工程文件中,添加新的源程序文件
4.编写代码
5.选择“Build target”菜单对编写好的工程文件进行编译链接。
6.点击““Start/Stop Debug Section””按键,对程序进行跟踪调试,在调试界面,单步执行,对CPU各寄存器的值的变化、以及相关内存的变化进行分析比较,判断程序的执行是否符合预期要求。
七、代码实现
(1).中值滤波程序代码如下所示:
AREA midfilter,CODE,READONLY
ENTRY
MOV R0,#5 ;要排序个数
MOV R9,R0
LDR R1,=0x40000000
LDR R2,=INIT
LOOP ;数据初始化
LDR R3,[R2],#4
STR R3,[R1],#4
SUBS R9,R9,#1
BNE LOOP
MOV R9,R0
SUB R9,R9,#1
OUTLOOP ;冒泡排序
MOV R4,#0
LDR R1,=0x40000000
INNERLOOP
LDRB R5,[R1],#4 ;取操作数
LDRB R6,[R1] ;取下一个操作数
CMP R5,R6
STRHI R6,[R1,#-4] ;R5操作数小于R6操作数时进行交换
STRHI R5,[R1]
ADD R4,R4,#1
CMP R4,R9 ;比较R9次
BNE INNERLOOP
SUBS R9,R9,#1
BNE OUTLOOP
MOV R7,R0,LSR #1 ;取中值下标
LDR R8,=0x40000000
ADD R8,R8,R7,LSL #2
LDR R1,[R8] ;取中值
INIT
DCD 0x05,0x03,0x09,0x16,0x02
END
(2) 均值滤波程序代码如下所示:
AREA midfilter,CODE,READONLY
ENTRY
MOV R0,#6 ;要排序个数
MOV R9,R0
LDR R1,=0x40000000
LDR R2,=INIT
LOOP1 ;数据初始化
LDR R3,[R2],#4
STR R3,[R1],#4
SUBS R9,R9,#1
BNE LOOP1
MOV R9,R0
LDR R2,=0x40000000
SUB R9,R9,#1
OUTLOOP ;冒泡排序
MOV R4,#0
LDR R1,=0x40000000
INNERLOOP
LDRB R5,[R1],#4 ;取操作数
LDRB R6,[R1] ;取下一个操作数
CMP R5,R6
STRHI R6,[R1,#-4] ;R5操作数小于R6操作数时进行交换
STRHI R5,[R1]
ADD R4,R4,#1
CMP R4,R9 ;比较R9次
BNE INNERLOOP
SUBS R9,R9,#1
BNE OUTLOOP
LDR R7,=0x40000004
MOV R9,R0
SUB R9,R9,#2
LOOP2 ;除去最大最小值求和,并放入R8寄存器
LDR R6,[R7],#4
ADD R8,R8,R6
SUBS R9,R9,#1
BNE LOOP2
MOV R1,R8,LSR #2
INIT
DCD 0x05,0x03,0x09,0x16,0x02,0x24
END
八、总结及心得体会:
思考题:用被除数一直减除数,直到被除数小于等于零,如果最后被除数为0则进行减法的次数就是商;如果被除数小于0,则商为进行减法的次数减1.
心得及体会:通过本次实验,了解到了两种图像处理算法:中值滤波跟均值滤波。也进一步提高了分析问题跟解决问题的能力。同时也对Keil MDK-ARM uVision4开发工具的使用更加熟悉,能够熟练的使用ARM汇编语言实现冒泡排序,对ARM汇编程序能力有了进一步的提高。
九、对本实验过程及方法、手段的改进建议:
改进1:在均值滤波的实验中,可以不必将全部数据排序,只需找出最大值跟最小值并记录下来,之后将所有数据全部求和,再减去最大值跟最小值然后求平均,这样可以减少时间复杂度,提高程序效率。
改进2:在均值滤波的实验中,求和可能会发生溢出,此时利用一个空闲寄存器来储存溢出部分数据,每次R8加1个数后,再将上述空闲寄存器的值加上标志位C的值。