1、图像平滑(去噪):编写超限像素平滑法,灰度最相近的K个邻点平均法(函数名称可以自定义),并对上面实验1选择的噪声图片进行处理,显示处理前后的各个图像,分析不同方法对不同噪声的处理效果及其优缺点。
%超限像素平滑法,5*5邻域
function [ output ] = smooth_method1(I,k )
[row,col]=size(I);
Inew=I;
for i=3:row-2
for j=3:col-2
Inew(i,j)=round(sum(sum(I(i-2:i+2,j-2:j+2)))/25);
end
end
result=zeros(row,col);
for i=1:row
for j=1:col
if(abs(Inew(i,j)-I(i,j))>k)
result(i,j)=Inew(i,j);
else
result(i,j)=I(i,j);
end
end
end
output=uint8(result);
end
%灰度最相近的K个邻点平均法,3*3窗口,算上中心值
function [ output ] = smooth_method2( I,k )
[row,col]=size(I);
Inew=I;
value=zeros(1,9);
value1=zeros(1,9);
for i=2:row-1
for j=2:col-1
value(1)=abs(I(i,j)-I(i-1,j-1));
value(2)=abs(I(i,j)-I(i-1,j));
value(3)=abs(I(i,j)-I(i-1,j+1));
value(4)=abs(I(i,j)-I(i,j-1));
value(5)=abs(I(i,j)-I(i,j));
value(6)=abs(I(i,j)-I(i,j+1));
value(7)=abs(I(i,j)-I(i+1,j-1));
value(8)=abs(I(i,j)-I(i+1,j));
value(9)=abs(I(i,j)-I(i+1,j+1));
value1(1)=I(i-1,j-1);
value1(2)=I(i-1,j);
value1(3)=I(i-1,j+1);
value1(4)=I(i,j-1);
value1(5)=I(i,j);
value1(6)=I(i,j+1);
value1(7)=I(i+1,j-1);
value1(8)=I(i+1,j);
value1(9)=I(i+1,j+1);
%冒泡排序
for b=1:9
for c=1:9-b
if(value(c)>value(c+1))
temp=value(c);
value(c)=value(c+1);
value(c+1)=temp;
temp1=value1(c);
value1(c)=value1(c+1);
value1(c+1)=temp1;
end
end
end
%计算
sum=0;
for a=1:k
sum=sum+value1(a);
end
Inew(i,j)=round(sum/k);
end
end
output=uint8(Inew);
end
%主程序
I=imread('L:\图像处理\实验文件\pout.tif');
J=imnoise(I,'gaussian',0,0.02); %在图像i上叠加均值为0、方差为0.02的高斯噪声,得到含噪图像j
K=imnoise(I,'salt & pepper',0.04) %在图像i上叠加密度为0.04的椒盐噪声,得到含噪图像k
subplot(3,3,1);
imshow(I);
title('原图像');
subplot(3,3,4);
imshow(J);
title('高斯噪声图像');
subplot(3,3,7);
imshow(K);
title('椒盐噪声图像');
%超限像素平滑法(5*5邻域,阈值为30)
J1=smooth_method1(J,30);
subplot(3,3,5);
imshow(J1);
title('超限像素平滑法处理高斯噪声');
K1=smooth_method1(K,30);
subplot(3,3,8);
imshow(K1);
title('超限像素平滑法处理椒盐噪声');
%灰度最相近的K个邻点平均法,3*3窗口
J2=smooth_method2(J,5);
subplot(3,3,6);
imshow(J2);
title('灰度最相近的K个邻点平均法处理高斯噪声');
K2=smooth_method2(K,5);
subplot(3,3,9);
imshow(K2);
title('灰度最相近的K个邻点平均法');
2、图像锐化:编写梯度锐化算法函数my_grad(method,T);参数method可以是梯度算子、Roberts算子、Prewitt和Sobel算子,T是梯度阈值,根据参数method和T选用不同的算子和阈值进行锐化处理,用二值图像表示处理结果,小于T的用黑色表示,大于等于T的用白色表示。显示处理前后的各个图像,分析不同方法对锐化效果及其优缺点。
function [ output ] = my_grad(img, method,T )
[m,n]=size(img);
imgr = zeros(m,n);
if(method==1)%梯度算子 倒三角差值
for i=2:m-1
for j=2:n-1
imgr(i,j)=abs(img(i,j)-img(i+1,j))+abs(img(i,j)-img(i,j+1));
%图像梯度
if imgr(i,j)<T
imgr(i,j) = 0;
else
imgr(i,j) = 255;
end
end
end
elseif(method==2)%Roberts算子
for i=2:m-1
for j=2:n-1
imgr(i,j)=abs(img(i,j)-img(i+1,j+1))+abs(img(i+1,j)-img(i,j+1));
%1-4,,加 3-2
if imgr(i,j)<T
imgr(i,j) = 0;
else
imgr(i,j) = 255;
end
end
end
elseif(method==3)%Prewitt算子
%与Sobel算子相同,方程的形式相同,但其中系数不同:
%可见:与Sobel算子不同,其重点没有放在接近于模板中心的像素点
for i=2:m-1
for j=2:n-1
imgr(i,j)=abs(img(i-1,j+1)+img(i,j+1)+img(i+1,j+1)-img(i-1,j-1)-img(i,j-1)-img(i+1,j-1)+img(i+1,j-1)+img(i+1,j)+img(i+1,j+1)-img(i-1,j-1)-img(i-1,j)-img(i-1,j+1));
%以 i,j为中心,3*3的矩阵,前面的3个竖线- 后面的三个 竖线,再整体加上
%以i,j为中心,3*3矩阵的 下面三个 减去上面三个 ,一起构成阈值
if imgr(i,j)<T
imgr(i,j) = 0;
else
imgr(i,j) = 255;
end
end
end
elseif(method==4)%Sobel算子
%由于引入了加权平均,所以对图像中的随机噪声具有一定的平滑作用
%由于采用间隔两行或两列的查分,边缘两侧的像素得到增强,锐化图像的边缘显得粗而亮
%S_x,S_y可用卷积模板来实现:
%可见:其重点放在接近于模板中心的像素点
for i=2:m-1
for j=2:n-1
imgr(i,j)=abs(img(i-1,j+1)+2*img(i,j+1)+img(i+1,j+1)-img(i-1,j-1)-2*img(i,j-1)-img(i+1,j-1)+ img(i+1,j-1)+2*img(i+1,j)+img(i+1,j+1)-img(i-1,j-1)-2*img(i-1,j)-img(i-1,j+1));
%以 i,j为中心,3*3的矩阵,前面的3个竖线,中间值为2倍- 后面的三个 竖线,再整体加上
%以i,j为中心,3*3矩阵的 下面三个 中间值为2倍 减去上面三个 ,一起构成阈值
if imgr(i,j)<T
imgr(i,j) = 0;
else
imgr(i,j) = 255;
end
end
end
end
output=uint8(imgr);
end
%主程序
I=imread('L:\图像处理\实验文件\pout.tif');
%I = rgb2gray(I);%将图像转为灰度图
I1=my_grad(I,1,20);
I2=my_grad(I,2,20);
I3=my_grad(I,3,20);
I4=my_grad(I,4,20);
subplot(2,3,1);
imshow(I);
title('原图像');
subplot(2,3,2);
imshow(I1);
title('梯度算子处理后的图像');
subplot(2,3,3);
imshow(I2);
title('Roberts算子处理后的图像');
subplot(2,3,4);
imshow(I3);
title('Prewitt算子处理后的图像');
subplot(2,3,5);
imshow(I4);
title('Sobel算子处理后的图像');