rimuovere i fori di un'immagine da valori medi di pixel circostanti
uno può please help me a riempire questi buchi neri dai valori assunti dalla vicina pixel diversi da zero. grazie
rimuovere i fori di un'immagine da valori medi di pixel circostanti
uno può please help me a riempire questi buchi neri dai valori assunti dalla vicina pixel diversi da zero. grazie
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.
grazie man questo dà un risultato soddisfacente –
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.
Sembra funzionerà fammi provare.grazie per il tuo impegno –
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:
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:
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.
http://cs.stackexchange.com/questions/23794/interpolation-optimization-problem – Royi
Duplicato su DSP: http://dsp.stackexchange.com/q/2803/590 – Chris
Risolvere questo: http://cs.stackexchange.com/questions/23794/interpolation-optimization-problem lo farebbe .. – Royi