2013-04-04 4 views
5

Domanda

Ho una sequenza di immagini che rappresenta informazioni di profondità che vorrei pulire. Ci sono alcuni valori anomali (valori con intensità inferiore a 25, per un intervallo 0-255) che vorrei essere riempito con un'alternativa accettabile (un valore medio localizzato in quell'area specifica potrebbe essere una buona ipotesi).Rimozione di valori anomali da un'immagine in scala di grigi

Qualcuno può vedere un modo semplice per farlo? Ho provato a utilizzare un filtro mediano (dimensione del filtro di 10) sostituendo i valori indesiderati con NaN, ma ha peggiorato la situazione, che migliora invece sostituendoli con un valore medio generale.

Basic trial

P.S. Qualcuno mi ha già proposto di utilizzare una ricostruzione wavelet veloce , ma io non so davvero da dove cominciare ...

soluzione implementata (finora)

La soluzione che ho implementato (prima di leggere su inpaint_nans suggerito per tmpearce) è:

  1. duplicare l'immagine originale;
  2. riempiendo i pixel non validi con un valore medio generale;
  3. utilizzare un disco circolare di raggio 10 per sfocarlo;
  4. sostituendo i valori validi nell'immagine originale con quello che ho ottenuto dal punto 3.
  5. corsa un filtro mediano di dimensione 10.
img2 = img;          
img2(img < .005) = mean(img(:));     
H = fspecial('disk',10);       
img3 = imfilter(img2,H,'symmetric');    
img4 = img;          
img4(img < .3) = img3(img < .3);     
filterSize = 10;         
padopt = {'zeros','indexed','symmetric'};   
IMG = medfilt2(img4, [1 1]*filterSize, padopt{p}); 

Second trial

risposta

7

Consiglio il contributo inpaint_nans da il MATLAB File Exchange - inizia come hai già fatto sostituendo i valori anomali con NaN e usa il link per andare da lì.

Dalla descrizione della funzione:

elementi Interpolate NaN in una matrice 2-D utilizzando elementi non NaN. Può anche estrapolare , in quanto non utilizza una triangolazione dei dati. Inpaint_nans offre diversi approcci diversi all'interpolazione, , che offrono un compromesso in termini di precisione rispetto alla velocità e alla memoria richiesti. Tutti i i metodi attualmente trovati in inpaint_nans sono basati su algebra lineare sparsa e discretizzazione PDE lineare . In sostanza, una PDE è risolta per essere coerente con le informazioni fornite.

Urrà per codice riusabile!

+5

miei pensieri esattamente, solo 20 secondi troppo tardi. +1 – bla

4

Utilizzare una funzione denominata roifill. Hai bisogno di pasticciarlo un po '. Ho dovuto usare imdilate perché interpola dal confine.

Codice:

testimage = imread('BAPz5.png'); 
testimage = double(rgb2gray(testimage)); 
testimage_filt = roifill(testimage,imdilate(testimage<100,true(4))); 
figure(1); 
subplot(1,2,1); 
imshow(testimage,[]); 
subplot(1,2,2); 
imshow(testimage_filt,[]); 

uscita:

enter image description here

1

Il post si risponde, ma solo per la cronaca, in [1], l'autore sulla base di un principio fondamentale delle forme naturali, cioè, gli oggetti seguono una levigatezza di secondo ordine, egli suggerisce un metodo di pittura che minimizza la curvatura in un senso dei minimi quadrati . Offre anche code. In bocca al lupo.

[1] Α Categoty-Livello 3-D Object Database: Mettere il lavoro kineckto (ICCV)

enter image description here

+0

Nota che [le risposte solo per il collegamento sono scoraggiate] (http://meta.stackoverflow.com/tags/link-only-answers/info), le risposte SO dovrebbero essere il punto finale di una ricerca di una soluzione (l'ennesima sosta di riferimenti, che tendono a scadere nel tempo). Si prega di considerare l'aggiunta di una sinossi autonoma qui, mantenendo il collegamento come riferimento. – kleopatra

+0

È fantastico! Grazie ** Darkmoor ** per la tua nota! È sempre bello ricevere l'opinione di qualcun altro, supportato da un articolo! – Atcold