web-dev-qa-db-ja.com

Python-3チャネルへのグレースケール画像

このようなコードがあります

from skimage import io as sio
test_image = imread('/home/username/pat/file.png')
test_image  = skimage.transform.resize(test_image, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True)
print test_image.shape # prints (128,128)
print test_image.max(), test_image.min() # prints 65535.0 0.0
sio.imshow(test_image)

さらに重要なことに、この画像を3つのチャネルに収める必要があるので、そのような入力を期待するニューラルネットワークに画像をフィードできます。

1チャンネルの画像を3チャンネルの画像に変換したいのですが、プロットしたり、意味をなしたりするときに合理的に見えます。

0をパディングしてみましたが、3つのチャネルに対して同じ値を3回コピーしようとしましたが、イメージを表示しようとすると、意味不明なように見えます。では、グレースケールではなくブルースケールのような画像になったとしても、画像を3つのチャネルに変換しながら、意味のある方法で視覚化できるようにするにはどうすればよいでしょうか。

編集:私が試した場合

test_image = skimage.color.gray2rgb(test_image)

画像はすべて白で、黒い点がいくつかあります。

試してみると、すべて同じ白、珍しい小さな黒い点が同じ

convert Test1_PC_1.tif -colorspace sRGB -type truecolor Test1_PC_1_new.tif

Gray2rgbで変換を試みる前

print type(test_image[0,0])
<type 'numpy.uint16'>

print type(test_image[0,0,0])
<type 'numpy.float64'>
6
Baron Yugovich

まあ、imshowはデフォルトで、画像強度を表示するために一種のヒートマップを使用しています。グレースケールイメージを表示するには、上記のようにカラーマップを指定します。

plt.imshow(image, cmap="gray")

今、私はあなたが画像のチャンネルを得ることができると思います:

image[:,:,i] where i is in {0,1,2}

特定のチャンネルの画像を抽出するには:

red_image = image.copy()
red_image[:,:,1] = 0
red_image[:,:,2] = 0

編集:あなたは間違いなくskimageを使用する必要がありますか? python-opencvモジュールはどうですか?次の例を試しましたか?

import cv2
import cv

color_img = cv2.cvtColor(gray_img, cv.CV_GRAY2RGB)
2
curi0uz_k0d3r