实验目录
第一节:图像滤波
内容:
1. 熟悉图像滤波的原理;
2. 通过滤波算法验证图;
1.1图像滤波
所谓的图像滤波就是将图像数据进行平滑处理,它和信号滤波不是一回事,本质是将颜色进行平滑,平滑后的图像有可能会改变源图像的清晰度。
视图说明
1.1.1平滑方式
选取一小块区域作为平滑处理的窗口,我们用该窗口内部的数据对中心像素点的颜色数据进行替代。
1.1.1.1均值滤波
1. 算法级算法
P11(滤波后图像像素点数据)= (p00 + p01 +p02+p10+p11+p12+p20+p21+p22)/9
算法级设计
Note:在处理图像的时候,窗口每次向右移动一列,当移动到最右边的时候,想想移动一行。
1. RTL级算法
我们计算平均数的数,RTL算法一般采用加权平均来实现,加权平均能够更好的反应平均值。
例如:考察一学年对数学知识的掌握程序,通过考试进行考察,进行三次考试,用平均程序考量,第一考试(主要考察过去对知识的掌握程度)88,第二次考试(考察当前中期对知识的掌握程序)60,第三次考试(考察一学年对知识的掌握程序)75
解析案例
代码设计实现
1.1.1.1中值滤波
P11(滤波后图像像素点数据)= MIDPIX9
滤波设计案例解析
1.2滤波验证
1.2.1HDL语言设计(均值滤波)
要求:默认图像分辨率600*400
600X400图像
部分Verilog代码设计实现图像:
If(cnt== 15)cnt<= 0;else cnt <=cnt+1;//默认16个clk计算一个结果
Always @(posedge clk )
If(cnt == 15)
If(col ==600-3 ) begin
If(row==400-3)
Row<=0;
Else
Row<=row<=1;
col<=0;end
else col<=col+1;
always @(posedge clk )
case(cnt )
0:addr<= row*600 +col+0;//P00
1:addr<= row*600 +col +1;//P01
2:addr<= row*600 +col +2;//P02
3:addr<= row*600 +col +0+600;//P10
4:addr<= row*600 +col +1+600;//P11
5:addr<= row*600 +col +2+600;//P12
6:addr<= row*600 +col +0+1200;//P20
7:addr<= row*600 +col +1+1200;//P21
8:addr<= row*600 +col +2+1200;//P22
endcase
always @(posedge clk ) begin
if(cnt==1)p00<=mem[addr];
if(cnt==2)p01<=mem[addr];
if(cnt==3)p02<=mem[addr];
…
if(cnt==9p22<=mem[addr];end
1.2.2MATA操作
图像读
Im = imread(‘ xxx.jpg’);
Im =rgb2gray(im);
Im=imnoise(im,’salt &pepper’,0.03);
Imshow(im);
fid=fopen(’ img.dat‘,‘wt’)
for i=1:1:400
for j=1:1:600
fprintf(fid,’ %x\n’,im(i,j));
end
end
fclose(fid);
文件导入
Poim = importdata(‘posim.dat’);
Poim=uint8(Poim);
Imshow(Poim);
1.2.3验证结果
验证结果1-1
验证结果1-11
1.2.4HDL语言设计(中值滤波)
要求:默认图像分辨率600*400
解析案例数据
1.2.4.1filter
该模块主要是对9个数据排序,取中间值,默认采用冒泡排序,原理如下:
冒泡排序算法的原理如下:[1]
1. 1.
比较相邻的元素。如果第一个比第二个大,就交换他们两个。[1];
2. 2.
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。[1];
3. 3.
针对所有的元素重复以上的步骤,除了最后一个。[1];
4. 4.
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。;
1.2.4.2数据交换比较程序实现
架构图
1.2.4.3冒泡排序
图1.2.4.1冒泡排序法程序实现
1.2.4.4中值滤波验证结果
经过滤波处理之后图片