【问题标题】:Creating a "white" image in numpy (2-D image)在 numpy 中创建“白色”图像(二维图像)
【发布时间】:2018-08-19 10:21:42
【问题描述】:

看起来我在理解图像如何在 numpy 数组中表示方面存在一些根本性的差距。

img = np.ones([100,100,3], dtype=np.uint8)*255
plt.imshow(img)

上面的代码创建了一个“白色”的 3 通道图像。

每个像素的值为 [255,255,255]

明白了。

现在我想创建一个“白色”灰度图像。我真的不需要 RGB 通道来存储白色图像,是吗?

img_bw = np.ones([100,100], dtype=np.uint8)*255
plt.imshow(img_bw, cmap = "gray")

即使每个像素位置的值为 255,这也会创建“黑色图像”?

好的,让我把我之前的 3 通道白色图像转换成灰度图,看看 numpy 数组是什么样子的。

img_bw1 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
plt.imshow(img_bw1, cmap = "gray") 

这也给了我一个“黑色图像”?

那么灰度“白色图像”的 numpy 矩阵到底是什么样的呢?

img = io.imread("https://www.colorcombos.com/images/colors/FFFFFF.png" , as_grey=True)
plt.imshow(img*255, cmap = "gray")

这是一张白色的图片。该矩阵中的每个像素的值都在 216 及以上

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

这也是一张白色的图片。该矩阵中的每个像素的值都在 0.86 及以上。

我完全迷路了。

问题 -

  1. 如何在 numpy 中创建灰度二维白色图像?

  2. 为什么不使用 cv2.Color 将 numpy 中的 3 通道白色图像转换为灰度图像给我一个白色图像?

【问题讨论】:

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


    【解决方案1】:

    当使用颜色图显示二维数组时,matplotlib 将首先 normalize the data 使其位于 0 和 1 之间。

    您的白色数组仅由 255 个组成,当尝试标准化相等值的数组时,文档指出它们都被转换为 0(请参见上面的链接),从而导致黑色渲染。要手动指定范围,请使用:

    plt.imshow(img, cmap='gray', vmin=0, vmax=255)
    

    您也可以尝试将img_bw 数组中的第一个像素设置为任何


    至于为什么这个“有效”:

    img = io.imread("https://www.colorcombos.com/images/colors/FFFFFF.png" , as_grey=True)
    plt.imshow(img*255, cmap = "gray")
    

    image in that link 周围有一个细灰色边框,因此在标准化后,灰色边框(图像的最暗部分)被缩放为 0(黑色),而白色内部的其余部分保持白色。

    【讨论】:

      【解决方案2】:

      使用 PIL 将数组编码为图像是一种方法 -

      img_bw = np.ones([100,100], dtype=np.uint8)*255
      img = Image.fromarray(img_bw)
      img.show()
      

      输出

      对于黑色,如果您只是更改为img_bw = np.ones([100,100], dtype=np.uint8)*0,您会得到 -

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        • 2015-09-11
        • 2020-09-10
        • 2012-09-27
        • 1970-01-01
        相关资源
        最近更新 更多