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

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

子函数:

%该种方法的基本思想是:先使用模板覆盖图像区域,若像素都属于一个区域,则区域内不含边界,则可以放心平滑去噪(高斯用均值,椒盐用中值);否则像素属于不同部分,即区域含有边界,那我们不平滑去噪,保持边界即可。
%编程的思想是: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));           %自己编写的中值去噪的峰值信噪比




  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是使用边界保持类平滑滤波进行图像去噪的Python代码: ```python import cv2 import numpy as np # 定义边界保持类平滑滤波函数 def boundary_preserving_smoothing_filter(image, kernel_size, sigma): # 高斯核大小为(kernel_size,kernel_size),标准差为sigma kernel = cv2.getGaussianKernel(kernel_size, sigma) # 对图像进行卷积 convolved = cv2.filter2D(image, -1, kernel) # 计算均值和标准差 mean, std = cv2.meanStdDev(image) # 计算边界保持权重 weight = np.zeros_like(image) weight[np.where(image > mean)] = 1 weight[np.where(image <= mean)] = 1 - np.exp(-np.square((image[np.where(image <= mean)] - mean)) / (2 * np.square(std))) # 对卷积结果和边界保持权重进行加权平均 output = weight * convolved + (1 - weight) * image return output.astype(np.uint8) # 加载图像 image = cv2.imread("noisy_image.jpg", cv2.IMREAD_GRAYSCALE) # 对图像进行高斯噪声处理 noisy_image = cv2.GaussianBlur(image, (5, 5), 5) # 对高斯噪声图像进行边界保持类平滑滤波去噪 denoised_image = boundary_preserving_smoothing_filter(noisy_image, 5, 5) # 显示去噪前后的图像 cv2.imshow("Original Image", image) cv2.imshow("Noisy Image", noisy_image) cv2.imshow("Denoised Image", denoised_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,我们使用了OpenCV库中的cv2.getGaussianKernel()函数生成了指定大小和标准差的高斯核,并使用cv2.filter2D()函数对图像进行卷积。然后,我们计算了图像的均值和标准差,并使用这些值计算了边界保持权重。最后,我们使用边界保持权重对卷积结果和原始图像进行加权平均,得到了去噪后的图像。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值