2013-04-04 11 views
5

Frage

Ich habe eine Bildersequenz, die Tiefeninformationen darstellt, die ich gerne reinigen würde. Es gibt einige Ausreißer (Werte mit einer Intensität unter 25, für einen Bereich von 0 bis 255), die ich gerne mit einer akzeptablen Alternative füllen würde (ein Durchschnittswert, der in diesem bestimmten Bereich lokalisiert ist, könnte eine gute Schätzung sein).Ausreißer aus einem Graustufenbild entfernen

Kann jemand einen einfachen Weg sehen, dies zu tun? Ich habe versucht, einen Medianfilter (Filtergröße 10) zu verwenden, der die unerwünschten Werte durch NaN ersetzt, aber es hat die Situation verschlechtert, die stattdessen verbessert wird, indem man sie durch einen allgemeinen Durchschnittswert ersetzt.

Basic trial

P. S. Jemand hat vorgeschlagen, mich bereits eine schnelle Wavelet-Rekonstruktion verwenden, aber ich würde nicht wirklich wissen, wo ich anfangen soll ...

implementierte Lösung (bisher)

Die Lösung, die ich umgesetzt (vor dem Lesen über inpaint_nans vorgeschlagen von tmpearce) ist:

  1. kopieren Sie das ursprüngliche Bild;
  2. Füllen der ungültigen Pixel mit einem allgemeinen Durchschnittswert;
  3. Verwenden Sie eine kreisförmige Scheibe von Ray 10 für die Unschärfe;
  4. ersetzt die ungültigen Werte im Originalbild mit dem, was ich von Punkt bekam 3.
  5. Lauf ein Medianfilter der Größe 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

Antwort

7

ich den inpaint_nans Beitrag empfehlen aus Die MATLAB File Exchange - starten Sie, wie Sie bereits getan haben, indem Sie Ausreißer mit NaN ersetzen und den Link verwenden, um von dort aus zu gehen.

Aus der Beschreibung der Funktion:

interpolieren NaN Elemente in einem 2-D-Array nicht-NaN Elemente. Kann auch extrapolieren, da es keine Triangulation der Daten verwendet. Inpaint_nans bietet mehrere verschiedene Ansätze für die Interpolation, , die Kompromisse in Bezug auf Genauigkeit gegenüber Geschwindigkeit und Speicher erfordern. Alle Methoden, die derzeit in inpaint_nans gefunden werden, basieren auf spärlichen linearen Algebra- und PDE-Diskretisierungen. Im Wesentlichen wird eine PDE als in Übereinstimmung mit den gelieferten Informationen gelöst.

Hurra für wiederverwendbaren Code!

+5

meine Gedanken genau, nur 20 Sekunden zu spät. +1 – bla

4

Verwenden Sie eine Funktion namens roifill. Du musst dich ein bisschen damit herumschlagen. Ich musste imdilate verwenden, weil es von der Grenze interpoliert.

Code:

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,[]); 

Ausgang:

enter image description here

1

Die Post beantwortet wird, aber nur für das Protokoll, in [1], der Autor, welche sich auf einem grundlegenden Prinzip der natürlichen Formen, dh, die Objekte folgen einer Glätte zweiter Ordnung, er schlägt ein In-painting-Verfahren vor, das die Krümmung in einem Sinn der kleinsten Quadrate minimiert. Er bietet auch code an. Viel Glück.

[1] Α Categoty-Level-3-D-Objektdatenbank: Setzen Sie die kineckto Arbeit (ICCV)

enter image description here

+0

Beachten Sie, dass [Link-Only-Antworten werden abgeraten] (http://meta.stackoverflow.com/tags/link-only-answers/info), SO Antworten sollten der Endpunkt einer Suche nach einer Lösung sein (vs. noch ein Zwischenstopp von Referenzen, die im Laufe der Zeit abgestanden werden). Bitte beachten Sie, dass Sie hier eine eigenständige Zusammenfassung hinzufügen und den Link als Referenz beibehalten. – kleopatra

+0

Das ist großartig! Danke ** Darkmoor ** für deine Nachricht! Es ist immer schön, jemand anderen Meinung zu bekommen, unterstützt von einem Papier! – Atcold