walkingmask’s development log

IT系の情報などを適当に書いていきます

MENU

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かけても同じ値にはならない。

ソースコード見てもかなり違う処理をしている。

じゃあどうすれば良いか?

そもそも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メッセージも最新のものを読まないといけませんね😉