Database tüddelei DBHanlder läuft gut für DIESE Datanbank struktur... App begonnen aber weit entfernt von gutem Stand
179 lines
3.0 KiB
Matlab
179 lines
3.0 KiB
Matlab
%% Repair to an image with 50% random artifacts
|
|
|
|
% Garden at Sainte-Adresse (Monet, 1867)
|
|
garden = imread('monet_adresse.jpg');
|
|
G = double(garden);
|
|
G(rand(size(G))<0.50) = NaN;
|
|
Gnan = G;
|
|
|
|
G(:,:,1) = inpaint_nans(G(:,:,1),2);
|
|
G(:,:,2) = inpaint_nans(G(:,:,2),2);
|
|
G(:,:,3) = inpaint_nans(G(:,:,3),2);
|
|
|
|
figure
|
|
subplot(1,3,1)
|
|
image(garden)
|
|
title 'Garden at Sainte-Adresse (Monet)'
|
|
|
|
subplot(1,3,2)
|
|
image(uint8(Gnan))
|
|
title 'Corrupted - 50%'
|
|
|
|
subplot(1,3,3)
|
|
image(uint8(G))
|
|
title 'Inpainted Garden'
|
|
|
|
%% Surface fit artifact removal
|
|
|
|
[x,y] = meshgrid(0:.01:1);
|
|
z0 = exp(x+y);
|
|
|
|
znan = z0;
|
|
znan(20:50,40:70) = NaN;
|
|
znan(30:90,5:10) = NaN;
|
|
znan(70:75,40:90) = NaN;
|
|
|
|
tic,z = inpaint_nans(znan,3);toc
|
|
|
|
tic
|
|
k = isnan(znan);
|
|
zk = griddata(x(~k),y(~k),z(~k),x(k),y(k));
|
|
zg = znan;
|
|
zg(k) = zk;
|
|
toc
|
|
|
|
figure
|
|
surf(z0)
|
|
title 'Original surface'
|
|
|
|
figure
|
|
surf(znan)
|
|
title 'Artifacts (large holes) in surface'
|
|
|
|
figure
|
|
surf(zg)
|
|
title(['Griddata inpainting (',num2str(sum(isnan(zg(:)))),' NaNs remain)'])
|
|
|
|
figure
|
|
surf(z)
|
|
title 'Inpainted surface'
|
|
|
|
figure
|
|
surf(zg-z0)
|
|
title 'Griddata error surface'
|
|
|
|
figure
|
|
surf(z-z0)
|
|
title 'Inpainting error surface (Note z-axis scale)'
|
|
|
|
%% Comparison of methods
|
|
|
|
[x,y] = meshgrid(-1:.02:1);
|
|
r = sqrt(x.^2 + y.^2);
|
|
z = exp(-(x.^2+ y.^2));
|
|
|
|
z(r>=0.9) = NaN;
|
|
|
|
z((r<=.5) & (x<0)) = NaN;
|
|
|
|
figure
|
|
pcolor(z);
|
|
title 'Surface provided to inpaint_nans'
|
|
|
|
% Method 0
|
|
tic,z0 = inpaint_nans(z,0);toc
|
|
|
|
% Method 1
|
|
tic,z1 = inpaint_nans(z,1);toc
|
|
|
|
% Method 2
|
|
tic,z2 = inpaint_nans(z,2);toc
|
|
|
|
% Method 3
|
|
tic,z3 = inpaint_nans(z,3);toc
|
|
|
|
% Method 4
|
|
tic,z4 = inpaint_nans(z,4);toc
|
|
|
|
% Method 5
|
|
tic,z5 = inpaint_nans(z,5);toc
|
|
|
|
figure
|
|
surf(z0)
|
|
colormap copper
|
|
hold on
|
|
h = surf(z);
|
|
set(h,'facecolor','r')
|
|
hold off
|
|
title 'Method 0 (Red was provided)'
|
|
|
|
figure
|
|
surf(z1)
|
|
hold on
|
|
h = surf(z);
|
|
set(h,'facecolor','r')
|
|
hold off
|
|
title 'Method 1 (Red was provided)'
|
|
|
|
figure
|
|
surf(z2)
|
|
hold on
|
|
h = surf(z);
|
|
set(h,'facecolor','r')
|
|
hold off
|
|
title 'Method 2 (Red was provided) - least accurate, but fastest'
|
|
|
|
figure
|
|
surf(z3)
|
|
hold on
|
|
h = surf(z);
|
|
set(h,'facecolor','r')
|
|
hold off
|
|
title 'Method 3 (Red was provided) - Slow, but accurate'
|
|
|
|
figure
|
|
surf(z4)
|
|
hold on
|
|
h = surf(z);
|
|
set(h,'facecolor','r')
|
|
hold off
|
|
title 'Method 4 (Red was provided) - designed for constant extrapolation!'
|
|
|
|
figure
|
|
h = surf(z5);
|
|
set(h,'facecolor','y')
|
|
hold on
|
|
h = surf(z);
|
|
set(h,'facecolor','r')
|
|
hold off
|
|
title 'Method 5 (Red was provided)'
|
|
|
|
|
|
%% 1-d "inpainting" using interp1
|
|
|
|
x = linspace(0,3*pi,100);
|
|
y0 = sin(x);
|
|
y = y0;
|
|
% Drop out 2/3 of the data
|
|
y(1:3:end) = NaN;
|
|
y(2:3:end) = NaN;
|
|
|
|
% inpaint_nans
|
|
y_inpaint = inpaint_nans(y,1);
|
|
|
|
% interpolate using interp1
|
|
k = isnan(y);
|
|
y_interp1c = y;
|
|
y_interp1s = y;
|
|
y_interp1c(k) = interp1(x(~k),y(~k),x(k),'cubic');
|
|
y_interp1s(k) = interp1(x(~k),y(~k),x(k),'spline');
|
|
|
|
figure
|
|
plot(x,y,'ro',x,y_inpaint,'b+')
|
|
legend('sin(x), missing 2/3 points','inpaint-nans','Location','North')
|
|
|
|
figure
|
|
plot(x,y0-y_inpaint,'r-',x,y0-y_interp1c,'b--',x,y0-y_interp1s,'g--')
|
|
title 'Inpainting residuals'
|
|
legend('Inpaint-nans','Pchip','Spline','Location','North')
|