效果图
此处我使用的是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])
注意图像名称要换成自己的图像名称!