Python-灰度图像到3个通道

时间:2018-08-11 20:46:52

标签: python image numpy image-processing scikit-image

我有类似这样的代码

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'>

3 个答案:

答案 0 :(得分:4)

您需要将数组从2D转换为3D,其中第三维是颜色。

您可以使用skimage提供的gray2rgb功能:

test_image = skimage.color.gray2rgb(test_image)

或者,您可以编写自己的转换-这样可以灵活地调整像素值:

# basic conversion from gray to RGB encoding
test_image = np.array([[[s,s,s] for s in r] for r in test_image],dtype="u1")

# conversion from gray to RGB encoding -- putting the image in the green channel
test_image = np.array([[[0,s,0] for s in r] for r in test_image],dtype="u1")

我从您的max()值中注意到,您使用的是16位样本值(不常见)。您需要一个不同的dtype,也许是"u16""int32"。另外,您可能需要玩一些游戏才能使图像以正确的极性显示(可能以黑白反转显示)。

一种实现方法是只反转所有像素值:

test_image = 65535-test_image ## invert 16-bit pixels

或者您可以查看normimshow参数,该参数似乎具有inverse功能。

答案 1 :(得分:2)

通过将灰度值复制三遍以使R==G==B正确,您可以从灰度值转换为RGB。

显示结果异常可能是由显示期间的假设引起的。在显示之前,您需要先缩放数据。

通常,uint8图像的值介于0-255之间,它们映射到显示的最小-最大比例。 Uint16的值为0-65535,其中65535映射为最大值。浮点图像通常被认为在0-1范围内,其中1映射到最大值。然后,任何更大的值也将被映射为max。这就是为什么您在输出图像中看到这么多白色的原因。

如果您将每个输出样本除以图片中的最大值,则可以正确显示它。

答案 2 :(得分:1)

好吧,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)