首页 > 解决方案 > 使用 skimage.color.gray2rgb 会产生错误的输出图像

问题描述

您好,我只是想编写一个代码来将灰度图像设置为三通道图像格式,然后显示它。我正在使用 skimage.color 函数 gray2rgb ,它确实改变了单比例图像矩阵的形状。但是,当想要绘制该转换的结果时,我得到了一个意想不到的图像作为输出。

此外,我很难创建一个空的 3 通道图像来填充我想要的任何单尺度信息。显然由于图像的性质为 uint16,matplotlib 存在一些问题

我试过 np.vstack、skimage.color.gray2rgb。它们都产生相同的输出。我尝试使用 np.uint8 将最大像素值从 65535 转换为 255,但它不起作用。似乎除法有效

from skimage.io import imread, imshow
import matplotlib.pyplot as plt
import os
import numpy as np
img = imread('516.jpg')
img_uint8 = np.uint8(img)
from skimage.color import gray2rgb
from skimage import img_as_float
img_rgb = gray2rgb(img_uint8, alpha=None)
print(img_rgb.shape)
plt.imshow(img_rgb)

显示的图像不是预期的!!!!

我希望图像类似于原始图像但可能具有不同的颜色,因为它应该是所有 3 个通道中的相同图像。我认为问题出在我的图像的 np.uint8 上。我用摄影师图像测试过,没有问题

标签: image-processinggrayscale

解决方案


我不知道为什么,但似乎使用img_as_ubyte可以在三个通道中复制灰度图像并能够显示类似于原始图像的图像

from skimage import img_as_ubyte
i = imread('516.jpg')
i_8 = img_as_ubyte(i)
imshow(i_8)
print(i_8)
i_8rgb = gray2rgb(i_8)
plt.imshow(i_8rgb, cmap='gray')

不知道为什么 np.uint8 会产生改变的结果。不知何故,使用 openCV 作为读取似乎总是将图像放在 uint8 范围内,这可能很方便。我等你的评论

用于测试的原始图像 这就是 np.uint8 似乎正在产生的


推荐阅读