1. 程式人生 > >[數字影象處理]影象去噪初步(1)--均值濾波器

[數字影象處理]影象去噪初步(1)--均值濾波器

close all;
clear all;
clc;

f = imread('./ckt-board-orig.tif');
f = mat2gray(f,[0 255]);
[M,N] = size(f);
%% ---------------gaussian noise-------------------
a = 0;
b = 0.1;
n_gaussian = a + b .* randn(M,N);

g_gaussian = f + n_gaussian; 
g_gaussian(find(g_gaussian > 1)) = 1;
g_gaussian(find(g_gaussian < 0)) = 0;

figure();
subplot(1,2,1);
imshow(g_gaussian,[0 1]);
xlabel('a).Image corrupted by Gaussian noise');

subplot(1,2,2);
x = linspace(-0.2,1.2,358);
h = hist(g_gaussian,x)/(M*N);
Histogram = zeros(358,1);
for y = 1:256
    Histogram = Histogram + h(:,y);
end
bar(-0.2:1/255:1.2,Histogram);
axis([-0.2 1.2 0 0.014]),grid;
xlabel('b).The Histogram of a');
ylabel('Number of pixels');

g_diff = abs(g_gaussian - f);

MSE = sum(sum(g_diff .^2))/(M*N);
PSNR = 10*log10((1*1)/MSE)

[SSIM_G mssim] = ssim_index(f,g_gaussian,[0.01 0.03],ones(8),1);

%% ---------------Denoise(Gaussian noise)-------------------
g_Ex = zeros(M+2,N+2);
for x = 1:M
    g_Ex(x+1,:) = [g_gaussian(x,1) g_gaussian(x,:) g_gaussian(x,N)];
end
g_Ex(1,:) = g_Ex(2,:);
g_Ex(M+2,:) = g_Ex(M+1,:);

% Arithemtic mean filter
g_amf = zeros(M,N);
for x = 2:M+1
    for y = 2:N+1
        g_amf(x-1,y-1) = g_amf(x-1,y-1) +  g_Ex(x  ,y);
        g_amf(x-1,y-1) = g_amf(x-1,y-1) +  g_Ex(x-1,y);
        g_amf(x-1,y-1) = g_amf(x-1,y-1) +  g_Ex(x  ,y-1);
        g_amf(x-1,y-1) = g_amf(x-1,y-1) +  g_Ex(x+1,y);
        g_amf(x-1,y-1) = g_amf(x-1,y-1) +  g_Ex(  x,y+1);
        g_amf(x-1,y-1) = g_amf(x-1,y-1) +  g_Ex(x-1,y+1);
        g_amf(x-1,y-1) = g_amf(x-1,y-1) +  g_Ex(x+1,y-1);
        g_amf(x-1,y-1) = g_amf(x-1,y-1) +  g_Ex(x+1,y+1);
        g_amf(x-1,y-1) = g_amf(x-1,y-1) +  g_Ex(x-1,y-1);
        
        g_amf(x-1,y-1) = g_amf(x-1,y-1)/9;
    end
end

g_amf_diff = abs(g_amf - f);

MSE_amf = sum(sum(g_amf_diff .^2))/(M*N);
PSNR_amf = 10*log10((1*1)/MSE_amf)

[SSIM_amf mssim] = ssim_index(f,g_amf ,[0.01 0.03],ones(8),1);

% Geometric mean filter

g_gmf = zeros(M,N);
for x = 2:M+1
    for y = 2:N+1
        g_gmf(x-1,y-1) = g_Ex(x  ,y);
        g_gmf(x-1,y-1) = g_gmf(x-1,y-1) *  g_Ex(x-1,y);
        g_gmf(x-1,y-1) = g_gmf(x-1,y-1) *  g_Ex(x  ,y-1);
        g_gmf(x-1,y-1) = g_gmf(x-1,y-1) *  g_Ex(x+1,y);
        g_gmf(x-1,y-1) = g_gmf(x-1,y-1) *  g_Ex(  x,y+1);
        g_gmf(x-1,y-1) = g_gmf(x-1,y-1) *  g_Ex(x-1,y+1);
        g_gmf(x-1,y-1) = g_gmf(x-1,y-1) *  g_Ex(x+1,y-1);
        g_gmf(x-1,y-1) = g_gmf(x-1,y-1) *  g_Ex(x+1,y+1);
        g_gmf(x-1,y-1) = g_gmf(x-1,y-1) *  g_Ex(x-1,y-1);
    end
end

g_gmf = (g_gmf).^(1/9);

g_gmf_diff = abs(g_gmf - f);
MSE_gmf = sum(sum(g_gmf_diff .^2))/(M*N);
PSNR_gmf = 10*log10((1*1)/MSE_gmf)

[SSIM_gmf mssim] = ssim_index(f,g_gmf ,[0.01 0.03],ones(8),1);

figure();
subplot(1,2,1);
imshow(g_amf,[0 1]);
xlabel('a).Ruselt of Denoise by Amf');

figure();
subplot(1,2,2);
imshow(g_gmf,[0 1]);
xlabel('a).Ruselt of Denoise by Gmf');

% Harmonic mean filter
g_hmf = zeros(M,N);
for x = 2:M+1
    for y = 2:N+1
        g_hmf(x-1,y-1) = 1/g_Ex(x  ,y);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x-1,y);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x  ,y-1);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x+1,y);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(  x,y+1);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x-1,y+1);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x+1,y-1);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x+1,y+1);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x-1,y-1);
        
        g_hmf(x-1,y-1) = 9/g_hmf(x-1,y-1);

    end
end

g_hmf_diff = abs(g_hmf - f);
MSE_hmf = sum(sum(g_hmf_diff .^2))/(M*N);
PSNR_hmf = 10*log10((1*1)/MSE_hmf)

[SSIM_hmf mssim] = ssim_index(f,g_hmf ,[0.01 0.03],ones(8),1);

figure();
subplot(1,2,1);
imshow(g_hmf,[0 1]);
xlabel('c).Ruselt of Denoise by Hmf');

%% ---------------Denoise(salt and pepper noise)----------
close all;
clear all;
clc;

f = imread('./ckt-board-orig.tif');
f = mat2gray(f,[0 255]);
[M,N] = size(f);
%% ---------------Salt & pepper-------------------
b = 0;  %salt
a = 0.2;    %pepper
x = rand(M,N);

g_sp = zeros(M,N);
g_sp = f;

g_sp(find(x<=a)) = 0;
g_sp(find(x > a & x<(a+b))) = 1;

g_diff = abs(g_sp - f);
MSE = sum(sum(g_diff .^2))/(M*N);
PSNR = 10*log10((1*1)/MSE)

figure();
subplot(1,2,1);
imshow(g_sp,[0 1]);
xlabel('a).Image corrupted by salt&pepper noise');

%% ---------------Denoise(Salt & pepper)-------------------
g_Ex = zeros(M+2,N+2);
for x = 1:M
    g_Ex(x+1,:) = [g_sp(x,1) g_sp(x,:) g_sp(x,N)];
end
g_Ex(1,:) = g_Ex(2,:);
g_Ex(M+2,:) = g_Ex(M+1,:);

% Harmonic mean filter
g_hmf = zeros(M,N);
for x = 2:M+1
    for y = 2:N+1
        g_hmf(x-1,y-1) = 1/g_Ex(x  ,y);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x-1,y);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x  ,y-1);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x+1,y);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(  x,y+1);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x-1,y+1);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x+1,y-1);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x+1,y+1);
        g_hmf(x-1,y-1) = g_hmf(x-1,y-1) +  1/g_Ex(x-1,y-1);
        
        g_hmf(x-1,y-1) = 9/g_hmf(x-1,y-1);
    end
end

g_hmf_diff = abs(g_hmf - f);
MSE_hmf = sum(sum(g_hmf_diff .^2))/(M*N);
PSNR_hmf = 10*log10((1*1)/MSE_hmf)

figure();
subplot(1,2,1);
imshow(g_sp,[0 1]);
xlabel('a).Image corrupted by pepper noise');

subplot(1,2,2);
imshow(g_hmf,[0 1]);
xlabel('b).Ruselt of Denoise by Hmf');

% Contraharmonic mean filter
Q = -1.5;

g_cmf = zeros(M,N);
for x = 2:M+1
    for y = 2:N+1
        g_cmf_M = (g_Ex(x  ,y))^(1+Q);
        g_cmf_M = g_cmf_M +  (g_Ex(x-1,y))^(1+Q);
        g_cmf_M = g_cmf_M +  (g_Ex(x  ,y-1))^(1+Q);
        g_cmf_M = g_cmf_M +  (g_Ex(x+1,y))^(1+Q);
        g_cmf_M = g_cmf_M +  (g_Ex(  x,y+1))^(1+Q);
        g_cmf_M = g_cmf_M +  (g_Ex(x-1,y+1))^(1+Q);
        g_cmf_M = g_cmf_M +  (g_Ex(x+1,y-1))^(1+Q);
        g_cmf_M = g_cmf_M +  (g_Ex(x+1,y+1))^(1+Q);
        g_cmf_M = g_cmf_M +  (g_Ex(x-1,y-1))^(1+Q);
        
        g_cmf_D = (g_Ex(x  ,y))^(Q);
        g_cmf_D = g_cmf_D +  (g_Ex(x-1,y))^(Q);
        g_cmf_D = g_cmf_D +  (g_Ex(x  ,y-1))^(Q);
        g_cmf_D = g_cmf_D +  (g_Ex(x+1,y))^(Q);
        g_cmf_D = g_cmf_D +  (g_Ex(  x,y+1))^(Q);
        g_cmf_D = g_cmf_D +  (g_Ex(x-1,y+1))^(Q);
        g_cmf_D = g_cmf_D +  (g_Ex(x+1,y-1))^(Q);
        g_cmf_D = g_cmf_D +  (g_Ex(x+1,y+1))^(Q);
        g_cmf_D = g_cmf_D +  (g_Ex(x-1,y-1))^(Q);
        
        g_cmf(x-1,y-1) = g_cmf_M/g_cmf_D;
    end
end

g_cmf_diff = abs(g_cmf - f);
MSE_cmf = sum(sum(g_cmf_diff .^2))/(M*N);
PSNR_cmf = 10*log10((1*1)/MSE_cmf)

figure();
subplot(1,2,1);
imshow(g_cmf,[0 1]);
xlabel('b).Ruselt of Denoise by Cmf(Q=-1.5)');