图像修复序列-Lowrank模型

    xiaoxiao2021-12-14  48

    低阶秩序图像修复模型 低阶秩图像修复模型,假设图像的数据维度秩(rank)较低,那么,可以利用该性质实现图像修复,具体模型如下: 通过将迹范数转化为核范数,将非凸优化问题转化为凸优化问题,如下: 通过迭代求解上述凸优化问题可以实现图像修复: % demo2.m % Date: 2015/6/12 % Author: HSW % HARBIN INSTITUTE OF TECHNOLOGY % set matlab close all; clear all; clc; % add path addpath(genpath('DamagedImage\')); addpath(genpath('ResultsImage\')); addpath(genpath('Solvers\')); addpath(genpath('TestImage\')); % Set True rank of Image Rank = 40; % read image Img = imread('TestImage2\Lowrank.bmp'); Img = imresize(Img,[256,256],'bicubic'); % Img = imread('TestImage2\mat.bmp'); % Img = imread('TestImage2\rattan.tif'); % Img = imread('TestImage2\Build.bmp'); %可以达到95% % Img = imread('TestImage\barba256.png'); % Img = imread('D82.gif'); % Img = imresize(Img,[256,256],'bicubic'); if size(Img,3) == 3 OrigImg = rgb2gray(Img); elseif size(Img,3) == 4 OrigImg = mean(Img,3); else OrigImg = Img; end OrigImg = OrigImg'; OrigImg = double(OrigImg); [U,S,V] = svd(OrigImg); OrigRank = length(find(S ~= 0)); S(Rank+1:end,:) = 0; %注意这里 LowRankImg = U*S*V'; figure; subplot(1,3,1) imshow(OrigImg/255,[]); title(['Image of Rank = ', num2str(OrigRank)]); subplot(1,3,2); imshow(LowRankImg/255,[]); title(['Image of Rank = ',num2str(Rank)]); subplot(1,3,3); imshow(abs(OrigImg - LowRankImg)/255,[]); title('差值图像'); % generate damaged image % 随机缺失 Ratio = 0.9; Mask = rand(size(LowRankImg)); Mask = (Mask >= Ratio); % 读入掩膜 % Mask = imread('Mask3.png'); % Mask = double(rgb2gray(Mask)) <= 2; % Mask = Mask'; % Mask = flipud(Mask); InImg = LowRankImg.*Mask; InterpImg = ImgInterp2(InImg,Mask,1:size(LowRankImg,1),1:size(LowRankImg,2)); % parameters muMin = 1e-8; eta = 0.25; kao = 1; BregmanMaxIterNum = 100; MaxIterNum = 50; xtol = 1e-10; ResultImg = FPCBregman(InImg,Mask,InterpImg,muMin,eta,kao,BregmanMaxIterNum,MaxIterNum,xtol); ResultImg = max(0,min(ResultImg,255)); PSNRin = 20*log10(255/sqrt(mean((InImg(:)-LowRankImg(:)).^2))); PSNRinterp = 20*log10(255/sqrt(mean((InterpImg(:)-LowRankImg(:)).^2))); PSNRout = 20*log10(255/sqrt(mean((ResultImg(:)-LowRankImg(:)).^2))); figure; subplot(1,3,1); imshow(InImg/255,[]); title(['缺损图像 PSNR = ',num2str(PSNRin)]); subplot(1,3,2); imshow(InterpImg/255,[]); title(['插值图像 PSNR = ',num2str(PSNRinterp)]); subplot(1,3,3); imshow(ResultImg/255,[]); title(['修复结果 PSNR = ',num2str(PSNRout)]); figure; subplot(1,3,1); imshow(InImg/255,[]); title(['缺损图像 PSNR = ',num2str(PSNRin)]); subplot(1,3,2); imshow(ResultImg/255,[]); title(['主要部分 PSNR = ',num2str(PSNRinterp)]); subplot(1,3,3); imshow((OrigImg-ResultImg)/255,[]); title(['反光部分 PSNR = ',num2str(PSNRout)]);FPC_Bregman.m/FPC2.m/ImgInterp2.m/ssim.m文件 function ResultImg = FPC_Bregman(InImg,Mask,InterpImg,muMin,eta,kao,BregmanMaxIterNum,MaxIterNum,xtol) % Inputs: % % Outputs: % % bk = 0; Imgk = InterpImg; condition = 1; k = 1; while condition k = k + 1; Imgold = Imgk; bk = InImg + (bk - Imgk.*Mask); Imgk = FPC2(bk,Mask,eta,muMin,kao,MaxIterNum,xtol); condition = (norm(Imgk - Imgold,'fro')/max(norm(Imgold,'fro'),norm(Imgk,'fro'))>= xtol) && k <= BregmanMaxIterNum; end ResultImg = Imgk; end %function FPC_Bregman function ResultImg = FPC2(b,Mask,eta,muMin,kao,MaxIterNum,xtol) %初始化 X = 0; L = 1; muL(L) = eta*norm(b,2); while muL(L) > muMin L = L + 1; muL(L) = max(muL(L-1)*eta,muMin); end for iter = 1:L condition = 1; k = 0; while condition Xold = X; k = k + 1; Y = X - kao*(Mask.*X - b); [U,S,V] = svd(Y); X = U*SNG(S,kao,muL(iter))*V'; condition = ((norm(X-Xold,'fro')/max(1,norm(X,'fro'))) >= xtol)&&(k <= MaxIterNum); end %while end %for ResultImg = X; end %ResultImg function S = SNG(S,kao,mu) S = sign(S).*max(abs(S) - kao*mu,0); end function y0=ImgInterp2(y0,I_nonzero,selx,sely,interp) if (~exist('interp','var')) interp='nearest'; end loc_z=y0(selx,sely); loc_mask=I_nonzero(selx,sely); [X,Y]=meshgrid(selx,sely); x=X(loc_mask==1); y=Y(loc_mask==1); z=loc_z(loc_mask==1); xi=X(loc_mask==0); yi=Y(loc_mask==0); interp=lower(interp); zi = griddata(x,y,z,xi,yi,interp); zi(isnan(zi))=0.; loc_z(loc_mask==0)=zi; y0(selx,sely)=loc_z; function [mssim, ssim_map] = ssim(img1, img2, K, window, L) % %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 % depends on the window size and the downsampling factor. % % ?sic Usage: % Given 2 test images img1 and img2, whose dynamic range is 0-255 % % [mssim, ssim_map] = ssim(img1, img2); % % ?vanced Usage: % User defined parameters. For example % % K = [0.05 0.05]; % window = ones(8); % L = 100; % [mssim, ssim_map] = ssim(img1, img2, K, window, L); % %Visualize the results: % % mssim %Gives the mssim value % imshow(max(0, ssim_map).^4) %Shows the SSIM index map %======================================================================== if (nargin < 2 | nargin > 5) ssim_index = -Inf; ssim_map = -Inf; return; end if (size(img1) ~= size(img2)) ssim_index = -Inf; ssim_map = -Inf; return; end [M N] = size(img1); if (nargin == 2) if ((M < 11) | (N < 11)) ssim_index = -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)) ssim_index = -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) ssim_index = -Inf; ssim_map = -Inf; return; end else ssim_index = -Inf; ssim_map = -Inf; return; end end if (nargin == 4) [H W] = size(window); if ((H*W) < 4 | (H > M) | (W > N)) ssim_index = -Inf; ssim_map = -Inf; return end L = 255; if (length(K) == 2) if (K(1) < 0 | K(2) < 0) ssim_index = -Inf; ssim_map = -Inf; return; end else ssim_index = -Inf; ssim_map = -Inf; return; end end if (nargin == 5) [H W] = size(window); if ((H*W) < 4 | (H > M) | (W > N)) ssim_index = -Inf; ssim_map = -Inf; return end if (length(K) == 2) if (K(1) < 0 | K(2) < 0) ssim_index = -Inf; ssim_map = -Inf; return; end else ssim_index = -Inf; ssim_map = -Inf; return; end end img1 = double(img1); img2 = double(img2); % automatic downsampling f = max(1,round(min(M,N)/256)); %downsampling by f %use a simple low-pass filter if(f>1) lpf = ones(f,f); lpf = lpf/sum(lpf(:)); img1 = imfilter(img1,lpf,'symmetric','same'); img2 = imfilter(img2,lpf,'symmetric','same'); img1 = img1(1:f:end,1:f:end); img2 = img2(1:f:end,1:f:end); end C1 = (K(1)*L)^2; C2 = (K(2)*L)^2; window = window/sum(sum(window)); 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); 结果如下,没有调整参数,如果调整参数结果更好:

    原始图像如下:

    参考文献: Tensor Completion for Estimating Missing Values in Visual Data
    转载请注明原文地址: https://ju.6miu.com/read-969953.html

    最新回复(0)