2012-07-05 10 views

risposta

5

C'è un file su scambio di file Matlab, - inpaint_nans che fa esattamente quello che vuoi. L'autore spiega perché e in quali casi è meglio della triangolazione di Delaunay.

+0

grazie man questo dà un risultato soddisfacente –

2

Per riempire una zona nera, effettuare le seguenti operazioni:

1) Identificare una sub-regione contenente l'area nera, minore è la migliore. Il caso migliore è solo i punti di confine del buco nero.

2) creare una triangolazione Delaunay dei punti non neri all'interno della sub-regione da:

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

3) Determinare i punti neri in cui triangolo Delaunay da:

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

4) Interpolazione:

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

Sembra funzionerà fammi provare.grazie per il tuo impegno –

8

Un buon modo per farlo è quello di risolvere lo linear heat equation. Quello che fai è fissare la "temperatura" (intensità) dei pixel nell'area buona e lasciare che il calore scorra nei pixel cattivi. Un passabile, ma un po 'lento, era per fare questo è ripetutamente media l'immagine quindi impostare i pixel buoni di nuovo al loro valore originale con newImage(~badPixels) = myData(~badPixels);.

devo fare le seguenti operazioni:

  1. trovare i pixel difettosi in cui l'immagine è pari a zero, poi si dilatano per essere sicuri di ottenere tutto
  2. Applicare una grande sfocatura, per cominciare velocemente
  3. media l'immagine, quindi impostare le buone pixel di nuovo al loro
  4. Ripetere il passaggio originale 3
  5. display

Si potrebbe ripetere la media fino a quando l'immagine si ferma cambiando, e si potrebbe utilizzare un kernel medi inferiori per maggiore precisione --- ma questo dà buoni risultati:

enter image description here

Il codice è il seguente:

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 

Ma è possibile ottenere una soluzione simile utilizzando roifill dalla casella degli strumenti di elaborazione delle immagini in questo modo:

newImage2 = roifill(originalImage, badPixels); 

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

avviso Sto usando gli stessi cattivi pixel definiti prima.

+0

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

Problemi correlati