.jpg
画像のサイズをskimage.transform.resize function
で変更しようとしています。関数は奇妙な結果を返します(下の画像を参照)。バグなのか、関数の使い方が間違っているのかわかりません。
import numpy as np
from skimage import io, color
from skimage.transform import resize
rgb = io.imread("../../small_dataset/" + file)
# show original image
img = Image.fromarray(rgb, 'RGB')
img.show()
rgb = resize(rgb, (256, 256))
# show resized image
img = Image.fromarray(rgb, 'RGB')
img.show()
元の画像:
サイズ変更された画像:
私はすでにチェックしました skimageのサイズ変更は奇妙な出力を与えます 、しかし私のバグは異なる性質を持っていると思います。
更新:rgb2lab関数にも同様のバグがあります。
問題は、skimageが、画像のサイズを変更した後、配列のピクセルデータ型を変換していることです。元の画像のピクセルあたりのビット数はnumpy.uint8
で、サイズ変更されたピクセルはnumpy.float64
変数です。
サイズ変更操作は正しいですが、結果が正しく表示されていません。この問題を解決するために、2つの異なるアプローチを提案します。
結果の画像のデータ構造を変更。 uint8値に変更する前に、ピクセルは0〜1の正規化されたスケールであるため、0〜255のスケールに変換する必要があります。
# ...
# Do the OP operations ...
resized_image = resize(rgb, (256, 256))
# Convert the image to a 0-255 scale.
rescaled_image = 255 * resized_image
# Convert to integer data type pixels.
final_image = rescaled_image.astype(np.uint8)
# show resized image
img = Image.fromarray(final_image, 'RGB')
img.show()
To 別のライブラリを使用画像を表示します。 画像ライブラリのドキュメント を見ると、3xfloat64ピクセルの画像をサポートするモードはありません。ただし、 scipy.misc ライブラリには、正しく表示するために配列形式を変換するための適切なツールがあります。
from scipy import misc
# ...
# Do OP operations
misc.imshow(resized_image)