scipy.misc.imresizeはどこへ行った?
最新のscipy 1.3ではscipy.misc.imresizeは削除されている。
https://scipy.github.io/devdocs/release.1.3.0.html#scipy-interpolate-changes
代わり何を使えばimresizeと全く同じ結果を得られるか?
scipy 1.1 では以下のようなメッセージが見られた。
`imresize` is deprecated in SciPy 1.0.0, and will be removed in 1.2.0. Use ``skimage.transform.resize`` instead.
https://github.com/scipy/scipy/blob/v1.1.0/scipy/misc/pilutil.py#L510
skimage.transform.resizeを使えばいいのかと試してみると失敗する。
>>> from scipy.misc import imresize >>> from skimage.transform import resize >>> image = np.random.randint(0, 255, [210, 160, 3], dtype="uint8") >>> resized1 = imresize(image[35:195], (80, 80)) >>> resized2 = resize(image[35:195], (80, 80)) >>> (resized1 - resized2).sum() 2432307.1
なぜか?オプションが違うのか?
skimage.transform.resizeは丁寧に0-1の範囲に正規化(正確には正規化ではないかもしれない)した値を返す模様。
>>> resized2.max() 0.9745098039215685 >>> resized2.min() 0.015686274509803838
かと行ってscipy.misc.imresizeを255で割ったり、skimage.transform.resizeに255かけても同じ値にはならない。
- https://github.com/scipy/scipy/blob/v1.2.1/scipy/misc/pilutil.py#L510-L566
- https://github.com/scikit-image/scikit-image/blob/master/skimage/transform/_warps.py#L19-L184
ソースコード見てもかなり違う処理をしている。
じゃあどうすれば良いか?
そもそもscipy 1.2以降ではWarningメッセージが変わっていて、PIL.Imageを使ってと言うことになっているらしい。
>>> from scipy.misc import imresize >>> from PIL import Image >>> image = np.random.randint(0, 255, [210, 160, 3], dtype="uint8") >>> resized1 = imresize(image, (80, 80)) >>> resized2 = np.array(Image.fromarray(image).resize((80, 80), resample=2)) >>> (resized1 - resized2).sum() 0
scipy.misc.imresizeのinterpのデフォルトがbilinearなので、resample=2を指定してあげる必要があるが、無事同じ値が得られた。めでたしめでたし。
Warningメッセージも最新のものを読まないといけませんね😉