灰度最小方差的均值滤波器

此为灰度最小方差的均值滤波器:在去噪能力上弱于传统的均值、中值滤波,但在保留图像边缘和细节能力方面要强于前者。

子函数:

%该种方法的基本思想是:先使用模板覆盖图像区域,若像素都属于一个区域,则区域内不含边界,则可以放心平滑去噪(高斯用均值,椒盐用中值);否则像素属于不同部分,即区域含有边界,那我们不平滑去噪,保持边界即可。
%编程的思想是:9个模板找出方差最小的那个模板,这个模板覆盖像素同属于同一区域的概率最高,含有边界的可能性最低,找出其对其平滑去噪即可
function[y]=grayminvariance(x)
[m,n]=size(x);
x=double(x);
y=x;
for i=3:m-2
    for j=3:n-2
    z1=[x(i-1,j+2),x(i,j+2),x(i+1,j+2),x(i-1,j+1),x(i,j+1),x(i+1,j+1),x(i,j)];
    z2=[x(i-1,j-1),x(i,j-1),x(i+1,j-1),x(i-1,j-2),x(i,j-2),x(i+1,j-2),x(i,j)];
    z3=[x(i-2,j+1),x(i-1,j+1),x(i-2,j),x(i-1,j),x(i-2,j-1),x(i-1,j-1),x(i,j)];
    z4=[x(i+1,j+1),x(i+2,j+1),x(i+1,j),x(i+2,j),x(i+1,j-1),x(i+2,j-1),x(i,j)];
    z5=[x(i-2,j+2),x(i-1,j+2),x(i-2,j+1),x(i-1,j+1),x(i,j+1),x(i-1,j),x(i,j)];
    z6=[x(i+1,j+2),x(i+2,j+2),x(i,j+1),x(i+1,j+1),x(i+2,j+1),x(i+1,j),x(i,j)];
    z7=[x(i-1,j),x(i-2,j-1),x(i-1,j-1),x(i,j-1),x(i-2,j-2),x(i-1,j-2),x(i,j)];
    z8=[x(i+1,j),x(i,j-1),x(i+1,j-1),x(i+2,j-1),x(i+1,j-2),x(i+2,j-2),x(i,j)];
    z9=[x(i-1,j+1),x(i,j+1),x(i+1,j+1),x(i-1,j-1),x(i,j-1),x(i+1,j-1),x(i-1,j),x(i,j),x(i+1,j)];
    z=[z1,z2,z3,z4,z5,z6,z7,z8,z9];
    h=[var(z1),var(z2),var(z3),var(z4),var(z5),var(z6),var(z7),var(z8),var(z9)];
    %对9个方差进行冒泡排序法
        for i1=1:1:8
            for j1=1:1:9-i1
                if h(1,j1) > h(1,j1+1)
                    z0=z(1,j1);%z0为临时变量
                    z(1,j1)=z(1,j1+1);
                    z(1,j1+1)=z0;
                end
            end
        end
    %最小方差已经求出,即h(1,1),对应z(1,1)这个向量,即对应的方差最小的模板
    y(i,j)=mean( z(1,1) );%中心像素获得最小方差模板对应的均值
    %y(i,j)=median( z(1,1) );%中心像素获得最小方差模板对应的中值
    end
end


主函数:

I=imread('1.jpg');
I=rgb2gray(I);
[e f]=size(I);
%J=imnoise(I,'salt & pepper',0.030);
J=imnoise(I,'gaussian',0,0.0002);

%%第一种算法在保持边缘和细节较第二种算法要好很多,当然第一种算法在去噪方面不彻底,不如第二种
l=grayminvariance(J);%灰度最小方差的均值滤波器
m=commonfilt2(J,3,3);%自己编写的均或中值滤波方法

subplot(1,2,1),imshow( uint8(l) ),title('灰度最小方差的均值or中值滤波器');
subplot(1,2,2),imshow( uint8(m)),title('普通均值滤波');

%2 计算三种算法的峰值信噪比
B=8;                %编码一个像素用多少二进制位
MAX=2^B-1;          %图像有多少灰度级

I=double(I);
l=double(l);
m=double(m);


%%%%%% psnr2=42.0913
MES2=sum(sum((I-l).^2))/(e*f);     %自适应中值去噪的均方差
PSNR2=20*log10(MAX/sqrt(MES2));           %自适应中值算法去噪的峰值信噪比

%%%%%% psnr3=21.1225
MES3=sum(sum((I-m).^2))/(e*f);     %自己编写的中值去噪的均方差
PSNR3=20*log10(MAX/sqrt(MES3));           %自己编写的中值去噪的峰值信噪比




好的,以下是使用边界保持类平滑滤波进行图像去噪的Matlab代码: ```matlab % 定义边界保持类平滑滤波函数 function output = boundary_preserving_smoothing_filter(image, kernel_size, sigma) % 生成高斯核 kernel = fspecial('gaussian', kernel_size, sigma); % 对图像进行卷积 convolved = imfilter(image, kernel, 'replicate'); % 计算均值和标准差 mean = mean2(image); std = std2(image); % 计算边界保持权重 weight = zeros(size(image)); weight(image > mean) = 1; weight(image <= mean) = 1 - exp(-((image(image <= mean) - mean) .^ 2) / (2 * std ^ 2)); % 对卷积结果和边界保持权重进行加权平均 output = weight .* convolved + (1 - weight) .* image; output = uint8(output); end % 加载图像 image = imread('noisy_image.jpg'); % 对图像进行高斯噪声处理 noisy_image = imgaussfilt(image, 5); % 对高斯噪声图像进行边界保持类平滑滤波去噪 denoised_image = boundary_preserving_smoothing_filter(noisy_image, 5, 5); % 显示去噪前后的图像 subplot(1, 3, 1), imshow(image), title('Original Image'); subplot(1, 3, 2), imshow(noisy_image), title('Noisy Image'); subplot(1, 3, 3), imshow(denoised_image), title('Denoised Image'); ``` 在上述代码中,我们使用Matlab自带的fspecial()函数生成了指定大小和标准差的高斯核,并使用了imfilter()函数对图像进行卷积。然后,我们计算了图像的均值和标准差,并使用这些值计算了边界保持权重。最后,我们使用边界保持权重对卷积结果和原始图像进行加权平均,得到了去噪后的图像。我们使用了subplot()函数将原始图像、含噪声图像和去噪后的图像分别显示在一个窗口中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值