(3)采用边界保持的中值滤波算法抑制图像中的椒盐噪声。该算法在抑制噪声的同时,有利于避免图像边界的模糊。算法原理如下:对于待处理的像素,使用3×3的模板,在模版的其他8个像素中,选择灰度值最与待处理像素最为接近的5个像素(不包括当前像素)的灰度值,对这5个灰度值进行排序,取中间的灰度值作为待处理像素的新灰度值。
采用matlab编程,对椒盐噪声污染的图像lenap.bmp进行边界保持的中值滤波处理。在同一个窗口中显示与比较噪声图像与处理后的图像。将处理后的图像取名为“边界保持滤波结果”,在当前路径下保存为bmp格式。
3.边界保持的中值滤波算法:
1. clc;clear;
2. I=imread('lenap.bmp'); 3. J=I;
4. [m,n]=size(I); 5. I=double(I); 6. J=double(J); 7. for i=2:m-1; 8. for j=2:n-1;
9. a=reshape(I(i-1:i+1,j-1:j+1),1,9); 10. a(5)=[ ];
11. b=a-I(i,j); 12. b=abs(b); 13. [c,d]=sort(b);
相关的Matlab函数提示:
将矩阵A转换为向量B: B=reshape(A,1,n),其中n为向量的元素总数;
将向量A中的第k个元素去掉:A(k)=[]; // 如:A=[ 3 5 1 4 6],令 A (3)= []; 则A=[3 5 4 6]。
向量排序函数为:sort( ) // 如:A=[ 3 5 1 4 6],则sort(A)= [1 3 4 5 6] [B,C]=sort(A); B为向量A排序后的新向量,C为A的各元素下标的排序向量 如:A=[ 3 5 1 4 6],[B,C]=sort(A); 则有:B= [1 3 4 5 6]; C=[3 1 4 2 5]; 矩阵I的坐标(i, j) 周围的3×3矩阵: I(i-1:i+1, j-1:j+1))
取向量中间值运算:median( ) // 如:A=[ 3 5 1 4 6],则median(A)=4; 取向量平均值运算:mean( ) // 如:A=[ 3 3 9],则mean(A)=5 取矩阵A的所有元素的平均值:mean(mean(A))
获取矩阵A的所有元素的中间值:median(median(A)) (注意:是各行中间值构成向量的中间值,此处不合题意不能用,均值函数可用)
J(i,j)=median(a(d(1:5)));
end end
14. J=uint8(J); 15. I=uint8(I);
16. imwrite(J,'边界保持滤波结果.bmp'); 17. subplot(1,2,1),imshow(I);
18. subplot(1,2,2),imshow(J),title('边界保持滤波
结果')
实验五:数字图像的锐化处理
实验目的:验证与设计数字图像的锐化算法
实验设备与软件:硬件:P4微机 软件:Matlab软件 实验原理:
(1) 采用水平方向的一阶微分算子处理图像。
采用水平方向的一阶微分算子处理图像可以用于提取图像水平方向的边缘信息,通过一个3×3的模板来实现。
?121?? H???000????1?2?1??采用取绝对值的方法对锐化图像进行后处理,即按照下式计算像素锐化后的值:
g(i,j)?f(i?1,j?1)?f(i?1,j?1)?2*[f(i?1,j)?f(i?1,j)]?f(i?1,j?1)?f(i?1,j?1)
计算结果中有的像素值还可能大于255。为了显示处理后的图像,将像素值限幅为255。
水平一阶微分算子锐化:
1. clear,clc 2.
3. 4. 5. 6.
I=imread('building.jpg'); I=double(I); J=I;
[m,n]=size(J); for i=2:m-1; for j=2:n-1;
J(i,j)=abs(I(i-1,j-1)-I(i+1,j-1)+2*(I(i-1,j)-I(i+1,j))+I(i-1,j+1)-I(i+1,j+); if J(i,j)>255
J(i,j)=255; end end
7. I=uint8(I);J=uint8(J);
8. subplot(1,2,1),imshow(I),title('原图像'); 9. subplot(1,2,2),imshow(J),title('新图像'); 10. imwrite(J,'水平锐化图像.bmp')
(2) 采用Sobel算子处理图像。
Sobel算子处理图像可以用于提取任意方向的边缘信息。其计算公式如下:
end
上式中的dx与dy都是采用以下3×3的模板来计算:
??1?2?1???101?? d???202? dx??000y????????121?101????即按照下式计算dx与dy:
为了显示处理后的图像,将像素值限幅为255。
(二阶微分算子)背景保持锐化:
1.
2. 3. 4. 5. 6.
clc,clear
I=imread('building.jpg'); I=double(I); J=zeros(size(I)); [m,n]=size(I); for i=2:m-1
for j=2:n-1
J(i,j)=4*I(i,j)-I(i-1,j)-I(i+1,j)-I(i,j-1)-I(i,j+1);
if J(i,j)>225 J(i,j)=225; end end
7. end 8. J=I+J;
9. I=uint8(I),J=uint8(J); 10. imshow(J)
11. imwrite(J,'背景保持的锐化图像.bmp')
实验内容:
(1)给定灰度图像building.jpg,采用matlab编程,采用水平方向的一阶微分算子对其进行处理。显示处理后的图像,并将其在当前路径下保存为“水平锐化图像.bmp”。
(2)给定灰度图像building.jpg,采用matlab编程,采用Sobel算子对其进行处理。显示处理后的图像,并将其在当前路径下保存为“Sobel锐化图像.bmp”。
(3)对于给定图像building.jpg,设计一种背景保持的图像锐化方法(例如,可以将Laplacian算子的处理结果与原图像进行叠加),使该图像的边缘变得清晰。并将其在当前路径下保存为“背景保持的锐化图像.bmp”。设计一种方法,使图像锐化的程度可以人为控制与选择。显示处理前后的图像,对比视觉效果的变化。
Sobel 算子锐化:
1. clc,clear
2. I=imread('building.jpg'); 3. I=double(I); 4. J=zeros(size(I)); 5. [m,n]=size(I); 6. for i=2:m-1 7. for j=2:n-1
8. x=I(i+1,j-1)-I(i-1,j-1)+2*(I(i+1,j)-I(i
-1,j))+I(i+1,j+1)-I(i-1,j+1);
9. y=I(i-1,j+1)-I(i-1,j-1)+2*(I(i,j+1)-I(i
,j-1))+I(i+1,j+1)-I(i+1,j-1); 10. J(i,j)=(x.^2+y.^2).^0.5; 11. if J(i,j)>225 J(i,j)=225; 12. end 13. end 14. end
15. I=uint8(I),J=uint8(J); 16. imshow(J)
17. imwrite(J,'Sobel锐化图像.bmp')
实验六:图像分割
实验内容(1)为必做;实验内容(2)为选做。
实验目的:验证图像分割的若干算法。
实验设备与软件:硬件:P4微机 软件:Matlab软件 实验原理:
图像分割是一种将灰度图像转换为二值图像的过程。计算公式如下:
f(i,j)?Th?1g(i,j)??f(i,j)?Th ?0 图像分割的关键在于确定合理的阈值Th。 (一)p-参数法
p-参数法,根据目标物在画面中所占的比例来选择阈值Th。对于已知目标物在画面中所占比例的情况下使用效果较好。假设背景为白色,目标物为黑色,算法步骤如下:
1)输入目标物所占画面的比例p;
2)计算原图的灰度直方图h; h(1)、h(256)是什么含义? (如何编程求向量h?)
3)计算灰度小于Th的像素个数N; (可以将N设置为对应于不同Th的向量,?)
4)设图像的尺寸为m×n,判断满足N(Th)>p*(m×n)条件的最小值N(Th),则输出Th的值;
5)按阈值Th对图像进行分割。 p-参数法:
1. clear,clc
2. I=imread('seal.bmp'); 3. I=double(I); 4. [m,n]=size(I);
5. J=logical(zeros(m,n)); 6. p=0.18
7. h=zeros(1,256); 8. for i=1:m 9. for j=1:n
10. h(I(i,j)+1)=h(I(i,j)+1)+1; 11. end 12. end
13. N(1)=h(1);
(二)基于灰度直方图的图像分割
? 假设某图像的灰度直方图具有二峰性( f(Ta)=Ha; f(Tb)=Hb ),表明这个图像较亮的区域和较暗的区域可以较好地分离。取二峰间的谷点为阈值Th,可以得到好的二值处理的效果。
15. for a=2:255;
16. N(a)=N(a-1)+h(a); 17. end
18. Th=min(find(N>p*m*n)) 19. for i=1:m; 20. for j=1:n; 21. if I(i,j)>=Th 22. J(i,j)=1; 23. else J(i,j)=0; 24. end 25. end 26. end
27. I=uint8(I);
28. subplot(1,2,1),imshow(J),title('新图像') 29. subplot(1,2,2),imshow(I),title('原图像') 30. imwrite(J,'p参数法分割图像.bmp')
实验内容:
(1)给定灰度图像Seal.bmp,假设已知目标物在画面所占比例为18%。采用matlab编程,采用p-参数法对其进行分割处理。在同一个窗口中同时显示原图像与分割图像,并将其在当前路径下保存为“p参数法分割图像.bmp”。(h,N,Th,分割)
(2)给定灰度图像ct.bmp,假设其直方图具有明显的二峰性:已知两个峰值对应的灰度级分别为:Ta=141;Tb=173。采用matlab编程,采用两峰之间的谷点所对应的灰度级作为阈值Th,对图像进行分割处理。显示原图像的直方图,显示处理后的图像,并将其在当前路径下保存为“基于直方图双峰性分割图像.bmp”。(h,局部h,最小像素个数的对应灰度级获取)
(略)
编程提示:
(1)图像直方图h为一个向量:h=zeros(1,256)。 h(1)~h(256) (2)显示图像直方图: imhist(I);
(3)定义分割后的二值图像矩阵J : J=logical(zeros(m, n));
(4)向量排序函数为:sort( ) [B,C]=sort(A); B为向量A排序后的新向量,C为A的各元素下标的排序向量。
(5)若x=[ 1 3 6 0 7 8]; y=find(x>2); 那么:y=[2 3 5 6];