一、 问题描述
对一副图像加噪,进行几何均值,算术均值,谐波,逆谐波处理,显示图像的结果;
二、 求解思路
利用imread和rgb2gray函数获取图像的灰度化矩阵,对于四种处理,分别建立四种变换的函数,按照
四个式子对图像进行处理,处理后分别显示,进行对比
三、 程序代码
clear;
clc;
close all
x=imread('3.png');
x=rgb2gray(x);
figure(1)
subplot(4,2,1)
imshow(x)
title('原图')
x1=imnoise(x,'gaussian');
subplot(4,2,2)
imshow(x1)
title('加高斯噪声后的图像')
junzhi=ones(3);
x1_1=fun_suanshu(x1,junzhi);
subplot(4,2,3)
imshow(x1_1,[])
title('加高斯噪声后用算术均值滤波器')
%注意直接使用阶乘会导致数据结构为uint8(最大值为255)
%计算时应注意改变数据类型为double
p=ones(3);
x1_2=fun_jihe(x1,p);
subplot(4,2,4)
imshow(x1_2,[])
title('加高斯噪声后用几何均值滤波器')
subplot(4,2,5)
x1_3=fun_xiebo(x1,p);
imshow(x1_3,[]);
title('加高斯噪声后用谐波均值滤波器')
subplot(4,2,6)
x1_4=fun_nixiebo(x1,p,1.5);
imshow(x1_4,[])
title('加高斯噪声后用逆谐波均值滤波器(Q=1.5)')
subplot(4,2,7)
x1_5=fun_nixiebo(x1,p,-1.5);
imshow(x1_5,[])
title('加高斯噪声后用逆谐波均值滤波器(Q=-1.5)')
%算术滤波处理函数
function y=fun_suanshu(x,t)
%x为原图像
%t为掩膜
row=size(x,1);
col=size(x,2);
new_x=zeros(row+2,col+2);
for i=2:row+1
for j=2:col+1
new_x(i,j)=x(i-1,j-1);
end
end
y=zeros(row,col);
row_t=size(t,1);
col_t=size(t,2);
for i=1:row
for j=1:col
y_k=new_x(i:i+row_t-1,j:j+col_t-1);
y(i,j)=sum(sum(y_k.*t));
end
end
end
%几何滤波处理函数
function y=fun_jihe(x,t)
%x为原图像
%t为大小为需要的大小,且全为1的矩阵
row=size(x,1);
col=size(x,2);
tem_y=x;
row_t=size(t,1);
col_t=size(t,2);
for i=(row_t+1)/2:row-(row_t+1)/2
for j=(col_t+1)/2:col-(col_t+1)/2
y_k=tem_y(i:i+row_t-1,j:j+col_t-1);
tem1=cumprod(double(y_k));
tem2=tem1(end,:);
tem3=cumprod(tem2);
tem4=tem3(end);
if tem4==0
y(i,j)=0;
else
y(i,j)=power(tem4,1/(row_t*col_t));
end
end
end
end
%谐波滤波处理函数
function y=fun_xiebo(x,t)
%x为原图像
%t为掩膜
row=size(x,1);
col=size(x,2);
new_x=zeros(row+2,col+2);
for i=2:row+1
for j=2:col+1
new_x(i,j)=x(i-1,j-1);
end
end
y=zeros(row,col);
row_t=size(t,1);
col_t=size(t,2);
for i=1:row
for j=1:col
y_k=new_x(i:i+row_t-1,j:j+col_t-1);
y(i,j)=row_t*col_t/sum(sum(1./(y_k.*t)));
end
end
end
%逆谐波滤波处理函数
function y=fun_nixiebo(x,t,Q)
%x为原图像
%t为掩膜
row=size(x,1);
col=size(x,2);
new_x=zeros(row+2,col+2);
for i=2:row+1
for j=2:col+1
new_x(i,j)=x(i-1,j-1);
end
end
y=zeros(row,col);
row_t=size(t,1);
col_t=size(t,2);
for i=1:row
for j=1:col
y_k=new_x(i:i+row_t-1,j:j+col_t-1);
y(i,j)=sum(sum((y_k.*t).^(Q+1)))/sum(sum((y_k.*t).^(Q)));
end
end
end
四、 实验心得
在处理图像的灰度化矩阵计算时,注意将矩阵转化为double类型,否则计算时系统自动赋值结果为uint8,此类型最大值为255,将会导致输出结果错误。