基于神经网络的退化图像复原算法是一种通过训练深度学习模型来恢复退化图像质量的方法。这种算法利用神经网络的强大表示学习能力,能够学习从模糊、噪声等退化图像中提取出干净、清晰的原始图像信息。
该算法的基本思路是通过建立一个端到端的神经网络模型,将退化图像作为输入,经过一系列的卷积、池化和非线性变换操作,最终输出恢复后的图像。下面是该算法的概述:
数据准备:首先,需要准备一组退化图像和对应的原始图像作为训练数据集。这些图像可以是经过模糊、噪声等处理得到的退化图像,同时还需要对应的清晰、高质量的原始图像作为标签。
神经网络架构:选择适当的神经网络架构对图像进行恢复。常用的架构包括卷积神经网络(CNN)、生成对抗网络(GAN)等。这些网络结构通常包括多个卷积层、池化层、激活函数和反卷积层等。
模型训练:使用训练数据集对神经网络进行训练。训练过程中,通过最小化恢复图像与原始图像之间的差异来优化网络参数。常用的损失函数包括均方误差(MSE)和感知损失等。
模型评估:使用测试数据集对训练好的模型进行评估。评估指标可以包括峰值信噪比(PSNR)、结构相似性指数(SSIM)等,用于衡量恢复图像与原始图像之间的相似度。
图像恢复:使用训练好的模型对新的退化图像进行恢复。将退化图像输入到神经网络中,经过前向传播得到恢复后的图像。
基于神经网络的退化图像复原算法在实际应用中取得了显著的成果。它能够有效地去除图像中的噪声、模糊等退化,提高图像质量,恢复图像的细节和清晰度。然而,该算法也存在一些挑战,如需要大量的训练数据、高计算资源要求等。因此,在实际应用中需要权衡算法的复杂性和性能要求。随着深度学习技术的不断发展,基于神经网络的退化图像复原算法有望在图像处理领域得到更广泛的应用。
主要代码如下:
clc;close all;clear all;warning off;%清除变量 rand('seed', 100); randn('seed', 100); format long g;
image1=imread('Lenna_gray.tif') ; image2=imresize(image1,[130,130]);%读入图像,并改变成90*90(如论文所述) image2=double(image2)./256; w=fspecial('gaussian',9,1);%加入高斯模糊 blurred_image=imfilter(image2,w); P_Matrix=zeros(9,((size(image2,1)-2)*(size(image2,2)-2)));%输入矩阵 T_Matrix=zeros(1,((size(image2,1)-2)*(size(image2,2)-2)));%目标矩阵 t=1; %初始化输入矩阵和目标矩阵 for i=2:1:(size(image2,1)-1) for j=2:1:(size(image2,2)-1) P_Matrix(1,t)=blurred_image(i-1,j-1); P_Matrix(2,t)=blurred_image(i-1,j); P_Matrix(3,t)=blurred_image(i-1,j+1); P_Matrix(4,t)=blurred_image(i,j-1); P_Matrix(5,t)=blurred_image(i,j); P_Matrix(6,t)=blurred_image(i,j+1); P_Matrix(7,t)=blurred_image(i+1,j-1); P_Matrix(8,t)=blurred_image(i+1,j); P_Matrix(9,t)=blurred_image(i+1,j+1);t=t+1; end end t=1; for i=2:1:(size(image2,1)-1) for j=2:1:(size(image2,2)-1) T_Matrix(1,t)=image2(i,j); t=t+1; end end %训练神经网络net 使用LM算法 net=newff(P_Matrix,T_Matrix,20); net=train(net,P_Matrix,T_Matrix); Y=sim(net,P_Matrix);%Y得到复原矩阵 t=1; restored_image=zeros(size(image2,1)-2,size(image2,2)-2);%复原图像 for i=1:1:size(image2,1)-2 for j=1:1:size(image2,2)-2 restored_image(i,j)=Y(1,t); t=t+1; end end figure,imshow(image2);%显示结果 figure,imshow(blurred_image); figure,imshow(restored_image); imwrite(blurred_image,'blurred_Lenna.jpg'); imwrite(restored_image,'restored_Lenna.jpg'); for i=1:1:(size(image2,1)-2) for j=1:1:(size(image2,2)-2) image4(i,j)=image2(i+1,j+1);%image2是90*90清晰的原图 end end PSNR_BP=Cal_PSNR(image4*255,restored_image*255); SSIM_BP=ssim_index(image4*255,restored_image*255); PSNR_BP_blurred=Cal_PSNR(image2*255,blurred_image*255); SSIM_BP_blurred=ssim_index(image2*255,blurred_image*255);
image1=imread('Cameraman.jpg') ; image1=imresize(image1,[130,130]);%读入图像,并改变成90*90(如论文所述) image2=double(image1)./256; w=fspecial('gaussian',[9 9],1);%加入高斯模糊 blurred_image=imfilter(image2,w); P_Matrix=zeros(9,((size(image2,1)-2)*(size(image2,2)-2)));%输入矩阵 %T_Matrix=zeros(1,7744);%目标矩阵 t=1; %初始化输入矩阵和目标矩阵 for i=2:1:(size(image2,1)-1) for j=2:1:(size(image2,2)-1) P_Matrix(1,t)=blurred_image(i-1,j-1); P_Matrix(2,t)=blurred_image(i-1,j); P_Matrix(3,t)=blurred_image(i-1,j+1); P_Matrix(4,t)=blurred_image(i,j-1); P_Matrix(5,t)=blurred_image(i,j); P_Matrix(6,t)=blurred_image(i,j+1); P_Matrix(7,t)=blurred_image(i+1,j-1); P_Matrix(8,t)=blurred_image(i+1,j); P_Matrix(9,t)=blurred_image(i+1,j+1);t=t+1; end end; Y=sim(net,P_Matrix);%Y得到复原矩阵 t=1; restored_image=zeros((size(image2,1)-2),(size(image2,2)-2));%复原图像 for i=1:1:(size(image2,1)-2) for j=1:1:(size(image2,2)-2) restored_image(i,j)=Y(1,t); t=t+1; end end %restored_image=restored_image./256; imshow(image1);%显示结果 figure,imshow(blurred_image);figure,imshow(restored_image); imwrite(blurred_image,'blurred_Camera.jpg'); imwrite(restored_image,'restrored_Camera.jpg'); for i=1:1:(size(image2,1)-2) for j=1:1:(size(image2,2)-2) image4(i,j)=image2(i+1,j+1);%image2是90*90清晰的原图 end end PSNR_BP_Camera=Cal_PSNR(image4*255,restored_image*255); SSIM_BP_Camera=ssim_index(image4*255,restored_image*255); PSNR_BP_blurred_Camera=Cal_PSNR(image2*255,blurred_image*255); SSIM_BP_blurred_Camera=ssim_index(image2*255,blurred_image*255);
function [mssim, ssim_map] = ssim_index(img1, img2, K, window, L)
%======================================================================== %SSIM Index, Version 1.0 %Copyright(c) 2003 Zhou Wang %All Rights Reserved. % %The author was with Howard Hughes Medical Institute, and Laboratory %for Computational Vision at Center for Neural Science and Courant %Institute of Mathematical Sciences, New York University, USA. He is %currently with Department of Electrical and Computer Engineering, %University of Waterloo, Canada. % %---------------------------------------------------------------------- %Permission to use, copy, or modify this software and its documentation %for educational and research purposes only and without fee is hereby %granted, provided that this copyright notice and the original authors' %names appear on all copies and supporting documentation. This program %shall not be used, rewritten, or adapted as the basis of a commercial %software or hardware product without first obtaining permission of the %authors. The authors make no representations about the suitability of %this software for any purpose. It is provided "as is" without express %or implied warranty. %---------------------------------------------------------------------- % %This is an implementation of the algorithm for calculating the %Structural SIMilarity (SSIM) index between two images. Please refer %to the following paper: % %Z. Wang, A. C. Bovik, H. R. Sheikh, and E. P. Simoncelli, "Image %quality assessment: From error measurement to structural similarity" %IEEE Transactios on Image Processing, vol. 13, no. 4, Apr. 2004. % %Kindly report any suggestions or corrections to zhouwang@ieee.org % %---------------------------------------------------------------------- % %Input : (1) img1: the first image being compared % (2) img2: the second image being compared % (3) K: constants in the SSIM index formula (see the above % reference). defualt value: K = [0.01 0.03] % (4) window: local window for statistics (see the above % reference). default widnow is Gaussian given by % window = fspecial('gaussian', 11, 1.5); % (5) L: dynamic range of the images. default: L = 255 % %Output: (1) mssim: the mean SSIM index value between 2 images. % If one of the images being compared is regarded as % perfect quality, then mssim can be considered as the % quality measure of the other image. % If img1 = img2, then mssim = 1. % (2) ssim_map: the SSIM index map of the test image. The map % has a smaller size than the input images. The actual size: % size(img1) - size(window) + 1. % %Default Usage: % Given 2 test images img1 and img2, whose dynamic range is 0-255 % % [mssim ssim_map] = ssim_index(img1, img2); % %Advanced Usage: % User defined parameters. For example % % K = [0.05 0.05]; % window = ones(8); % L = 100; % [mssim ssim_map] = ssim_index(img1, img2, K, window, L); % %See the results: % % mssim %Gives the mssim value % imshow(max(0, ssim_map).^4) %Shows the SSIM index map % %========================================================================
if (nargin < 2 | nargin > 5) mssim = -Inf; ssim_map = -Inf; return; end
if (size(img1) ~= size(img2)) mssim = -Inf; ssim_map = -Inf; return; end
[M N] = size(img1);
if (nargin == 2) if ((M < 11) | (N < 11)) mssim = -Inf; ssim_map = -Inf; return end window = fspecial('gaussian', 11, 1.5); % K(1) = 0.01; % default settings K(2) = 0.03; % L = 255; % end
if (nargin == 3) if ((M < 11) | (N < 11)) mssim = -Inf; ssim_map = -Inf; return end window = fspecial('gaussian', 11, 1.5); L = 255; if (length(K) == 2) if (K(1) < 0 | K(2) < 0) mssim = -Inf; ssim_map = -Inf; return; end else mssim = -Inf; ssim_map = -Inf; return; end end
if (nargin == 4) [H W] = size(window); if ((H*W) < 4 | (H > M) | (W > N)) mssim = -Inf; ssim_map = -Inf; return end L = 255; if (length(K) == 2) if (K(1) < 0 | K(2) < 0) mssim = -Inf; ssim_map = -Inf; return; end else mssim = -Inf; ssim_map = -Inf; return; end end
if (nargin == 5) [H W] = size(window); if ((H*W) < 4 | (H > M) | (W > N)) mssim = -Inf; ssim_map = -Inf; return end if (length(K) == 2) if (K(1) < 0 | K(2) < 0) mssim = -Inf; ssim_map = -Inf; return; end else mssim = -Inf; ssim_map = -Inf; return; end end
C1 = (K(1)*L)^2; C2 = (K(2)*L)^2; window = window/sum(sum(window)); img1 = double(img1); img2 = double(img2);
mu1 = filter2(window, img1, 'valid'); mu2 = filter2(window, img2, 'valid'); mu1_sq = mu1.*mu1; mu2_sq = mu2.*mu2; mu1_mu2 = mu1.*mu2; sigma1_sq = filter2(window, img1.*img1, 'valid') - mu1_sq; sigma2_sq = filter2(window, img2.*img2, 'valid') - mu2_sq; sigma12 = filter2(window, img1.*img2, 'valid') - mu1_mu2;
if (C1 > 0 & C2 > 0) ssim_map = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))./((mu1_sq + mu2_sq + C1).*(sigma1_sq + sigma2_sq + C2)); else numerator1 = 2*mu1_mu2 + C1; numerator2 = 2*sigma12 + C2; denominator1 = mu1_sq + mu2_sq + C1; denominator2 = sigma1_sq + sigma2_sq + C2; ssim_map = ones(size(mu1)); index = (denominator1.*denominator2 > 0); ssim_map(index) = (numerator1(index).*numerator2(index))./(denominator1(index).*denominator2(index)); index = (denominator1 ~= 0) & (denominator2 == 0); ssim_map(index) = numerator1(index)./denominator1(index); end
mssim = mean2(ssim_map); %figure,imshow(ssim_map); %imwrite(ssim_map,'ssimmap.tif'); return
程序结果如下:
完整代码见: https://download.csdn.net/download/corn1949/88792123
参考文献:
[1]王辉.基于神经网络的退化图像复原算法研究[J]. 2007.
好文链接
发表评论