web-dev-qa-db-ja.com

Skimage-サイズ変更機能の奇妙な結果

.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()

元の画像:

original

サイズ変更された画像:

resized

私はすでにチェックしました skimageのサイズ変更は奇妙な出力を与えます 、しかし私のバグは異なる性質を持っていると思います。

更新:rgb2lab関数にも同様のバグがあります。

8
Primoz

問題は、skimageが、画像のサイズを変更した後、配列のピクセルデータ型を変換していることです。元の画像のピクセルあたりのビット数はnumpy.uint8で、サイズ変更されたピクセルはnumpy.float64変数です。

サイズ変更操作は正しいですが、結果が正しく表示されていません。この問題を解決するために、2つの異なるアプローチを提案します。

  1. 結果の画像のデータ構造を変更。 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()
    
  2. To 別のライブラリを使用画像を表示します。 画像ライブラリのドキュメント を見ると、3xfloat64ピクセルの画像をサポートするモードはありません。ただし、 scipy.misc ライブラリには、正しく表示するために配列形式を変換するための適切なツールがあります。

    from scipy import misc
    # ...
    # Do OP operations
    misc.imshow(resized_image)
    
15
Jalo