#発生した問題
python3でnumpyを用いた画像処理(画像評価)ソフトの出力に,
平均・標準偏差・最大・最小にinfとNaNが含まれる.
import numpy as np
img = #なんか画像の配列
print(np.max(img))
print(np.min(img))
print(np.mean(img))
print(np.std(img))
>inf
>-inf
>NaN
>NaN
こんな感じ
結構ハマった
#inf,NaNとは
そもそもinfとかNaNってなんだろうと思って
調べると沢山情報が出てきました.
###inf
infinityの略.無限大を表す.
-infは負の無限大なわけですね.
###NaN
浮動小数点数にはNaN (Not a Number, 非数) と呼ばれる、実数の異常な値を表す特殊な数があります。
これは無限大-無限大、0.0/0.0といった不定形や、負数の平方根、負数の対数といった実数で表せない計算を行った場合に発生します。
NaNのお話より
僕の理解では,考慮したくない・計算時に除外する値(数)って認識です.
#対策方法
###1.infをNaNに置き換える
import numpy as np
img = #なんか画像の配列
img[img == -np.inf] = np.nan
img[img == np.inf] = np.nan
これで配列からinfは消えました.次に進みましょう
###2.NaNを考慮した関数を使う
import numpy as np
img = #なんか画像の配列
img[img == -np.inf] = np.nan
img[img == np.inf] = np.nan
最小, 最大 = np.nanmax(img), np.nanmin(img)
平均 = np.nanmean(img)
標準偏差 = np.nanstd(img)
#他にも合計や分散もある
参考:https://note.nkmk.me/python-numpy-nansum/
###3.理解を深めるためのお話
これどういう処理をしてるんだろうってお話です.
最大や平均を求めるときにNaN要素を除外して計算しています.
例えば平均の計算ですと,全体の合計値に含ませないし要素の数にも含みません.
配列の中からNaNってやつを削除してしまうイメージ.
じゃあ削除すればいいじゃんと思うかもしれませんが,画像処理ではそうもいかんです.
削除してしまったら画像の縦横の大きさとかくるってしまいますからね.
とりあえず,0で割ったり0を割ったりしてるとinfやNaNが含まれてしまうので,
そういった処理をしているソフトなら基本的に上の処理を行いましょうねといった感じでしょうか.
#あとがき
このことに気づくのって結構大変でした.
自分はよくimageJでやるような画像処理の作業を自動化してるのですが,
ソフトの出力結果とimageJで処理した結果が違ってたので気づけました.
infは除外しちゃうんだ~って感じましたね.画像処理の世界では常識なんですかね?