2012-07-05 8 views

Antwort

5

Es ist eine Datei auf Matlab Dateiaustausch, - inpaint_nans dass macht genau das, was du willst. Der Autor erklärt, warum und in welchen Fällen es besser ist als die Delaunay-Triangulation.

+0

danke Mann das gibt ein befriedigendes Ergebnis –

2

einem schwarzen Bereich zu füllen, gehen Sie wie folgt vor:

1) Stellen Sie einen Teilbereich in den schwarzen Bereich enthalten ist, desto kleiner, desto besser. Der beste Fall ist nur die Grenzpunkte des Schwarzen Lochs.

2) Erstellen einer Delaunay-Triangulation der nicht-schwarzen Punkte in Inneren der Subregion durch:

tri = DelaunayTri(x,y); %# x, y (column vectors) are coordinates of the non-black points. 

3) Bestimme die schwarzen Punkte in dem Dreieck Delaunay von:

[t, bc] = pointLocation(tri, [x_b, y_b]); %# x_b, y_b (column vectors) are coordinates of the black points 
tri = tri(t,:); 

4) interpolieren:

v_b = sum(v(tri).*bc,2); %# v contains the pixel values at the non-black points, and v_b are the interpolated values at the black points. 
+0

Scheint, es funktioniert, lass mich es versuchen.Danke für Ihre Mühe –

8

Eine gute Möglichkeit, dies zu tun, ist es, die linear heat equation zu lösen. Was Sie tun, ist die "Temperatur" (Intensität) der Pixel in der guten Gegend zu fixieren und die Wärme in die schlechten Pixel fließen zu lassen. Eine passable, aber etwas langsame Vorgehensweise war es, das Bild immer wieder zu mitteln und dann die guten Pixel mit newImage(~badPixels) = myData(~badPixels); auf ihren ursprünglichen Wert zurückzusetzen.

ich die folgenden Schritte aus:

  1. die schlechten Pixel finden, wo das Bild gleich Null ist, dann erweitern sich sicher sein, wir alles
  2. eine große Unschärfe Nehmen bekommen wir schneller
  3. Durchschnitt zu erhalten begonnen das Bild, stellen Sie dann die guten Pixel wieder an ihren ursprünglichen
  4. Wiederholen Sie Schritt 3
  5. Anzeige

Sie könnten Lungs wiederholen, bis das Bild zu verändern aufhört, und man kann einen kleineren Lungs Kernel für höhere Präzision verwenden --- aber das gibt gute Ergebnisse:

enter image description here

Der Code ist wie folgt:

numIterations = 30; 
avgPrecisionSize = 16; % smaller is better, but takes longer 

% Read in the image grayscale: 
originalImage = double(rgb2gray(imread('c:\temp\testimage.jpg'))); 

% get the bad pixels where = 0 and dilate to make sure they get everything: 
badPixels = (originalImage == 0); 
badPixels = imdilate(badPixels, ones(12)); 

%# Create a big gaussian and an averaging kernel to use: 
G = fspecial('gaussian',[1 1]*100,50); 
H = fspecial('average', [1,1]*avgPrecisionSize); 

%# User a big filter to get started: 
newImage = imfilter(originalImage,G,'same'); 
newImage(~badPixels) = originalImage(~badPixels); 

% Now average to 
for count = 1:numIterations 
    newImage = imfilter(newImage, H, 'same'); 
    newImage(~badPixels) = originalImage(~badPixels); 
end 

%% Plot the results 
figure(123); 
clf; 

% Display the mask: 
subplot(1,2,1); 
imagesc(badPixels); 
axis image 
title('Region Of the Bad Pixels'); 

% Display the result: 
subplot(1,2,2); 
imagesc(newImage); 
axis image 
set(gca,'clim', [0 255]) 
title('Infilled Image'); 

colormap gray 

Aber man kann eine ähnliche Lösung von der Bildverarbeitungs Toolbox roifill erhalten wie folgt:

newImage2 = roifill(originalImage, badPixels); 

figure(44); 
clf; 
imagesc(newImage2); 
colormap gray 

notice Ich benutze die gleichen badPixels wie zuvor definiert.

+0

http://cs.stackexchange.com/questions/23794/interpolation-optimization-problem – Royi

Verwandte Themen