使用竞争神经网络CNNs进行图像降噪Matlab代码

效果图

此处我使用的是200*200像素的彩色lena图,读者可以根据自己的需要更换为自己的图像。

a.原图        b.随机噪声损坏后的图像        c.修复后的图像

竞争神经网络方程

function dxdt = odefun(t, x, d1, d2, a11, a22, a12, a21, B1, B2, I1, I2, alpha1, alpha2, beta1, beta2)
    f = @(x) (1+exp(-x))^(-1);
    dx1dt = -d1 * x(1) + a11 * f(x(1)) + a12 * f(x(2)) + B1 * x(3) + I1;
    dx2dt = -d2 * x(2) + a21 * f(x(1)) + a22 * f(x(2)) + B2 * x(4) + I2;
    dS1dt = -alpha1 * x(3) + beta1 * f(x(1));
    dS2dt = -alpha2 * x(4) + beta2 * f(x(2));
    dxdt = [dx1dt; dx2dt; dS1dt; dS2dt];
end

仅作展示,运行时不会用到该代码,但读者可以根据实际情况对照更改为自己的方程参数

图像降噪Matlab代码

% 竞争神经网络方程参数设置 
d1 = 1; d2 = 2;
a11 = 7; a12 = 1; 
a21 = 1.5; a22 = 6; 
B1 = 1/6; B2 = 1;
I1 = -4; I2 = -8;
alpha1 = 2; alpha2 = 3;
beta1 = 12; beta2 = 27;
% 读取和处理图像
original_image = imread('lena200.jpg');%处理图像名称为lena200.jpg
%original_image = rgb2gray(original_image); % 彩色图像
original_image = im2double(original_image); % 转换为双精度

% 将图像的像素作为初始状态存入神经网络
[rows, cols, hegs] = size(original_image);%长宽高
x1 = original_image;
x2 = original_image;
S1 = 0.5 * ones(rows, cols, hegs);
S2 = 0.5 * ones(rows, cols, hegs);

% 激活函数(Sigmoidal型激活函数)
f = @(x) 1 ./ (1 + exp(-x)); % 逐元素计算的激活函数
dt = 0.001;
max_iter = 100;

% 将原始图像存入网络平衡点
for iter = 1:max_iter
    k1x1 = dt * (-d1 * x1 + a11 * f(x1) + a12 * f(x2) + B1 * S1 + I1);
    k1x2 = dt * (-d2 * x2 + a21 * f(x1) + a22 * f(x2) + B2 * S2 + I2);
    k1S1 = dt * (-alpha1 * S1 + beta1 * f(x1));
    k1S2 = dt * (-alpha2 * S2 + beta2 * f(x2));
    
    k2x1 = dt * (-d1 * (x1 + 0.5 * k1x1) + a11 * f(x1 + 0.5 * k1x1) + a12 * f(x2 + 0.5 * k1x2) + B1 * (S1 + 0.5 * k1S1) + I1);
    k2x2 = dt * (-d2 * (x2 + 0.5 * k1x2) + a21 * f(x1 + 0.5 * k1x1) + a22 * f(x2 + 0.5 * k1x2) + B2 * (S2 + 0.5 * k1S2) + I2);
    k2S1 = dt * (-alpha1 * (S1 + 0.5 * k1S1) + beta1 * f(x1 + 0.5 * k1x1));
    k2S2 = dt * (-alpha2 * (S2 + 0.5 * k1S2) + beta2 * f(x2 + 0.5 * k1x2));
    
    k3x1 = dt * (-d1 * (x1 + 0.5 * k2x1) + a11 * f(x1 + 0.5 * k2x1) + a12 * f(x2 + 0.5 * k2x2) + B1 * (S1 + 0.5 * k2S1) + I1);
    k3x2 = dt * (-d2 * (x2 + 0.5 * k2x2) + a21 * f(x1 + 0.5 * k2x1) + a22 * f(x2 + 0.5 * k2x2) + B2 * (S2 + 0.5 * k2S2) + I2);
    k3S1 = dt * (-alpha1 * (S1 + 0.5 * k2S1) + beta1 * f(x1 + 0.5 * k2x1));
    k3S2 = dt * (-alpha2 * (S2 + 0.5 * k2S2) + beta2 * f(x2 + 0.5 * k2x2));
    
    k4x1 = dt * (-d1 * (x1 + k3x1) + a11 * f(x1 + k3x1) + a12 * f(x2 + k3x2) + B1 * (S1 + k3S1) + I1);
    k4x2 = dt * (-d2 * (x2 + k3x2) + a21 * f(x1 + k3x1) + a22 * f(x2 + k3x2) + B2 * (S2 + k3S2) + I2);
    k4S1 = dt * (-alpha1 * (S1 + k3S1) + beta1 * f(x1 + k3x1));
    k4S2 = dt * (-alpha2 * (S2 + k3S2) + beta2 * f(x2 + k3x2));
    
    x1 = x1 + (1/6) * (k1x1 + 2*k2x1 + 2*k3x1 + k4x1);
    x2 = x2 + (1/6) * (k1x2 + 2*k2x2 + 2*k3x2 + k4x2);
    S1 = S1 + (1/6) * (k1S1 + 2*k2S1 + 2*k3S1 + k4S1);
    S2 = S2 + (1/6) * (k1S2 + 2*k2S2 + 2*k3S2 + k4S2);
end

% 损坏图像(在平衡点附近)
damaged_image = original_image + 0.5 * randn(size(original_image)); % 添加小的随机噪声

% 使用损坏的图像进行迭代修复
x1 = damaged_image;
x2 = damaged_image;

for iter = 1:max_iter
    k1x1 = dt * (-d1 * x1 + a11 * f(x1) + a12 * f(x2) + B1 * S1 + I1);
    k1x2 = dt * (-d2 * x2 + a21 * f(x1) + a22 * f(x2) + B2 * S2 + I2);
    k1S1 = dt * (-alpha1 * S1 + beta1 * f(x1));
    k1S2 = dt * (-alpha2 * S2 + beta2 * f(x2));
    
    k2x1 = dt * (-d1 * (x1 + 0.5 * k1x1) + a11 * f(x1 + 0.5 * k1x1) + a12 * f(x2 + 0.5 * k1x2) + B1 * (S1 + 0.5 * k1S1) + I1);
    k2x2 = dt * (-d2 * (x2 + 0.5 * k1x2) + a21 * f(x1 + 0.5 * k1x1) + a22 * f(x2 + 0.5 * k1x2) + B2 * (S2 + 0.5 * k1S2) + I2);
    k2S1 = dt * (-alpha1 * (S1 + 0.5 * k1S1) + beta1 * f(x1 + 0.5 * k1x1));
    k2S2 = dt * (-alpha2 * (S2 + 0.5 * k1S2) + beta2 * f(x2 + 0.5 * k1x2));
    
    k3x1 = dt * (-d1 * (x1 + 0.5 * k2x1) + a11 * f(x1 + 0.5 * k2x1) + a12 * f(x2 + 0.5 * k2x2) + B1 * (S1 + 0.5 * k2S1) + I1);
    k3x2 = dt * (-d2 * (x2 + 0.5 * k2x2) + a21 * f(x1 + 0.5 * k2x1) + a22 * f(x2 + 0.5 * k2x2) + B2 * (S2 + 0.5 * k2S2) + I2);
    k3S1 = dt * (-alpha1 * (S1 + 0.5 * k2S1) + beta1 * f(x1 + 0.5 * k2x1));
    k3S2 = dt * (-alpha2 * (S2 + 0.5 * k2S2) + beta2 * f(x2 + 0.5 * k2x2));
    
    k4x1 = dt * (-d1 * (x1 + k3x1) + a11 * f(x1 + k3x1) + a12 * f(x2 + k3x2) + B1 * (S1 + k3S1) + I1);
    k4x2 = dt * (-d2 * (x2 + k3x2) + a21 * f(x1 + k3x1) + a22 * f(x2 + k3x2) + B2 * (S2 + k3S2) + I2);
    k4S1 = dt * (-alpha1 * (S1 + k3S1) + beta1 * f(x1 + k3x1));
    k4S2 = dt * (-alpha2 * (S2 + k3S2) + beta2 * f(x2 + k3x2));
    
    x1 = x1 + (1/6) * (k1x1 + 2*k2x1 + 2*k3x1 + k4x1);
    x2 = x2 + (1/6) * (k1x2 + 2*k2x2 + 2*k3x2 + k4x2);
    S1 = S1 + (1/6) * (k1S1 + 2*k2S1 + 2*k3S1 + k4S1);
    S2 = S2 + (1/6) * (k1S2 + 2*k2S2 + 2*k3S2 + k4S2);
end

% 合并和归一化
restored_image = x1 + x2 + S1 + S2;
restored_image = (restored_image - min(restored_image(:))) / (max(restored_image(:)) - min(restored_image(:)));

% 显示修复后的图像
figure;
imshow(original_image);
% title('Original Image');

figure;
% subplot(1, 2, 1);
imshow(damaged_image);
% title('Damaged Image');
imwrite(damaged_image, 'damaged.png');
figure;
% subplot(1, 2, 2);
imshow(restored_image);
% title('Restored Image');
imwrite(restored_image, 'restored.png');
% 计算和显示评估指标
disp(['均方误差MSE  ','峰值信噪比PSNR  ','结构相似系数SSIM  '])
mse_value_dam = immse(damaged_image, original_image);
psnr_value_dam = psnr(damaged_image, original_image);
ssim_value_dam = ssim(damaged_image, original_image);
disp([mse_value_dam,psnr_value_dam,ssim_value_dam])
mse_value = immse(restored_image, original_image);
psnr_value = psnr(restored_image, original_image);
ssim_value = ssim(restored_image, original_image);
disp([mse_value,psnr_value,ssim_value])

 注意图像名称要换成自己的图像名称!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值