【问题标题】:greyscale image to 3 channels灰度图像到 3 个通道
【发布时间】:2019-01-19 01:54:15
【问题描述】:

我的代码看起来像这样

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

【问题讨论】:

  • 它(可能)是彩色的,因为您没有设置颜色图,默认值在这里有点糟糕。没有人能告诉你如何神奇地为一些未知的 NN 派生颜色,因为大多数用于自然颜色的 NN 将完全失败。
  • 你试过gray2rgb吗? scikit-image.org/docs/dev/api/…

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


【解决方案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)

【讨论】:

  • 对不起,我问的是如何将 1 通道图像转换为 3 通道图像,在绘制时看起来很合理。
  • 好的,抱歉,请参阅我的更新答案。您是否也尝试过使用颜色图绘制 3 通道图像,看看是否有意义?
【解决方案2】:

您需要将数组从 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

或者您可以查看imshownorm 参数,它似乎具有inverse 函数。

【讨论】:

  • 谢谢,会试试的。你能详细说明一下dtype的东西吗?另外,您对我最初的尝试为什么不起作用有任何合乎逻辑的解释吗?
  • 我试过 test_image = skimage.color.gray2rgb(test_image),我得到一个带有一些罕见小黑点的白色图像,不起作用。
  • dtype 设置数组内部使用的数值数据类型。您可能需要特别注意这一点。尝试在转换前后打印样本值的类型,以确保某些内容没有发生根本变化。 2D:print type(test_image[0,0]) 3D:print type(test_image[0,0,0])
  • imshow docscmap is ignored if X is 3-D, directly specifying RGB(A) values. 这是我对您为什么看不到合理的东西的猜测。看看如果你反转图像会发生什么。
  • 我将如何反转图像,确切的命令是什么?另外,请参阅我对上述原始问题所做的修改。
【解决方案3】:

通过将灰度值复制 3 次以使 R==G==B 正确,您将灰度值转换为 RGB。

奇怪的显示结果很可能是由于在显示过程中做出的假设造成的。您需要在显示之前对数据进行缩放以修复它。

通常,uint8 图像的值是 0-255,映射到显示的最小-最大比例。 Uint16 的值为 0-65535,其中 65535 映射到最大值。浮点图像通常被假定在 0-1 范围内,其中 1 映射到最大值。任何更大的值也将被映射到最大值。这就是为什么您会在输出图像中看到如此多的白色。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2019-04-02
    • 2015-02-13
    • 1970-01-01
    • 2019-03-15
    • 2013-10-28
    相关资源
    最近更新 更多