Wie ersetze ich NaN-Werte für Bilddaten?

8

Mein Datensatz enthält insgesamt 200 Spalten, wobei jede Spalte in allen meinen Bildern demselben Pixel entspricht. Insgesamt habe ich 48.500 Zeilen. Die Beschriftungen für die Daten reichen von 0 bis 9.

Die Daten sehen ungefähr so ​​aus:

raw_0   raw_1   raw_2   raw_3   raw_4
0   120.0   133.0   96.0    155.0   66.0
1   159.0   167.0   163.0   185.0   160.0
2   45.0    239.0   66.0    252.0   NaN
3   126.0   239.0   137.0   NaN 120.0
4   226.0   222.0   153.0   235.0   171.0
5   169.0   81.0    100.0   44.0    104.0
6   154.0   145.0   76.0    134.0   175.0
7   77.0    35.0    105.0   108.0   112.0
8   104.0   55.0    113.0   90.0    107.0
9   97.0    253.0   255.0   251.0   141.0
10  224.0   227.0   84.0    214.0   57.0
11  NaN 13.0    51.0    50.0    NaN
12  82.0    213.0   61.0    98.0    59.0
13  NaN 40.0    84.0    7.0 39.0
14  129.0   103.0   65.0    159.0   NaN
15  123.0   128.0   116.0   198.0   111.0

Jede Spalte hat ungefähr 5% fehlende Werte und ich möchte diese NaN-Werte mit etwas Sinnvollem füllen. Ich bin mir jedoch nicht sicher, wie ich das anstellen soll. Anregungen wäre willkommen.

Vielen Dank!

Amer Farooq
quelle

Antworten:

8

Angesichts der Tatsache, dass Sie Bilder als Spalten in einer Tabelle mit ~ 48.500 Zeilen ausgestreckt haben, gehe ich davon aus, dass Sie die Rohbilder mit einer Größe von 220 x 220 haben.

Sie können eine über OpenCV verfügbare Funktion namens verwenden inpaint, mit der fehlende Pixelwerte wiederhergestellt werden (z. B. schwarze Pixel von verschlechterten Fotos).

Hier ist ein Bildbeispiel. Oben links wird das Bild mit fehlenden Werten angezeigt (in Schwarz). Oben rechts werden nur die fehlenden Werte (die Maske) angezeigt. Unten links und unten rechts sind die endgültigen Ausgaben, in denen zwei verschiedene Algorithmen zum Füllen der Bilder verglichen werden.

wiederhergestelltes Bild

Ich würde vorschlagen, beide Methoden an Ihren Bildern auszuprobieren, um zu sehen, was am besten aussieht.

Werfen Sie einen Blick auf die Dokumentation , um weitere Informationen über die Algorithmen selbst. Hier ist die Dokumentation der eigentlichen Funktion .

Der Code sieht ungefähr so ​​aus:

import opencv as cv    # you will need to install OpenCV

dst = cv.inpaint(img, mask, 3, cv.INPAINT_TELEA)
  • Das erste Argument ist Ihr Bild mit fehlenden Werten
  • Die zweite ist die Maske mit Stellen, an denen fehlende Pixel vorhanden sind, dh welche Pixel gefüllt / interpoliert werden sollen.
  • Drittens ist der Radius um fehlende Pixel zu füllen
  • viertens ist das Flag, das der Algorithmus verwenden soll (siehe Link oben für zwei Alternativen)

Für jedes Bild können Sie die Maske folgendermaßen generieren:

mask = image[image == np.nan]
n1k31t4
quelle
Danke für den Vorschlag! Sieht vielversprechend aus.
Amer Farooq
2

Danach gibt es mehrere Möglichkeiten. Sie können die Imputation, die Medianimputation, die Modusimputation oder die häufigste Wertimputation durchführen. Berechnen Sie einen der oben genannten Werte für Zeilen oder Spalten, je nachdem, wie Ihre Daten strukturiert sind. Eine der einfachsten Möglichkeiten, Nans zu füllen, sind df.fillnaPandas

karthikeyan mg
quelle
2

Für jedes (x, y) wenn NAN können Sie den Durchschnitt der umgebenden Pixel wie folgt unterstellen:

if((x==0  & y==0):
 return (x+1)+(y+1))/2 

else if(x==x_max & y==y_max):
 return (x-1)+(y-1))/2

else if(x==0 & y==y_max):
 return (x+1)+(y-1))/2

else if(x==x_max & y==0):
 return (x-1)+(y+1))/2

else if(x==0):
 return ((x+1)+(y-1)+(y+1))/3

else if(x==x_max):
 return ((x-1)+(y-1)+(y+1))/3

else if(y==0):
 return ((x+1)+(x-1)+(y+1))/3

else if(y==y_max):
 return ((x-1)+(x+1)+(y-1))/3

else :
  return  ((x-1)+(x+1)+(y-1)+(y+1))/4 
Ansh
quelle
1

Wenn benachbarte Zeilen benachbarte Pixel sind, würde ich nur den Durchschnittswert der benachbarten Pixel verwenden. Das scheint für ein Bild sinnvoll zu sein und wäre für das menschliche Auge sicherlich schwer zu sehen.

bstrain
quelle