画像データのNaN値を置き換える方法は?


8

私のデータセットには合計200列があり、各列はすべての画像の同じピクセルに対応しています。合計で48,500行あります。データのラベルの範囲は0〜9です。

データは次のようになります。

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

各列には約5%の欠損値があり、これらのNaN値を意味のあるもので埋めたいと思います。しかし、どうすればいいのかわかりません。どんな提案も歓迎します。

ありがとうございました!

回答:


8

約48,500行のテーブルの列として画像が引き伸ばされている場合、220x220のサイズの未加工画像があると想定しています。

OpenCVを介して利用できると呼ばれる関数を使用できますinpaint。これにより、欠落しているピクセル値(劣化した写真の黒いピクセルなど)が復元されます。

これが画像の例です。左上は欠損値(黒)のある画像です。右上には欠損値(マスク)のみが表示されます。左下と右下は最終的な出力で、画像を塗りつぶすための2つの異なるアルゴリズムを比較しています。

復元された画像

私はあなたの画像で両方の方法を試して、何が最もよく見えるかを確認することをお勧めします。

持っているより多くの詳細については、マニュアルを見アルゴリズム自体には。これが実際の関数のドキュメントです

コードに関しては、次のようになります。

import opencv as cv    # you will need to install OpenCV

dst = cv.inpaint(img, mask, 3, cv.INPAINT_TELEA)
  • 最初の引数は、欠損値のある画像です
  • 2番目はマスクで、欠落しているピクセルの場所、つまりどのピクセルを塗りつぶす/補間するかを指定します。
  • 3番目は、欠落しているピクセルの周囲の半径です。
  • 4番目は、使用するアルゴリズムのフラグです(2つの選択肢については、上記のリンクを参照してください)。

画像ごとに、次のようなものでマスクを生成できます。

mask = image[image == np.nan]

提案ありがとうございます!有望に見えます。
Amer Farooq、

2

この後、いくつもの方法があります。平均代入、中央代入、モード代入、または最も一般的な値代入を行うことができます。データの構造に応じて、行または列のいずれかの上記の値の1つを計算します。ナンを埋める最も簡単な方法の1つはdf.fillnaパンダです


2

(x、y)の場合、NANの場合、次のように周囲のピクセルの平均に代入できます。

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 

1

隣接する行が隣接するピクセルである場合、隣接するピクセルの平均値を使用します。それは画像にとって理にかなっているようで、確かに人間の目で見るのは難しいでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.