在 numpy 中创建 "white" 图像(二维图像)
Creating a "white" image in numpy (2-D image)
看来我对 numpy 数组中图像的表示方式的理解存在一些根本性的差距。
img = np.ones([100,100,3], dtype=np.uint8)*255
plt.imshow(img)
以上代码创建了一个 "white" 3 通道图像。
每个像素的值为 [255,255,255]
明白了。
现在我想创建一个 "white" 灰度图像。我真的不需要 RGB 通道来存储白色图像,对吗?
img_bw = np.ones([100,100], dtype=np.uint8)*255
plt.imshow(img_bw, cmap = "gray")
即使每个像素位置的值为 255,这也会创建一个 "black image"?
好吧,让我把我之前的 3 通道白色图像转换成灰度图,看看 numpy 数组是什么样子的。
img_bw1 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
plt.imshow(img_bw1, cmap = "gray")
这也给了我一个"black image"?
那么灰度 "white image" 的 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 及以上。
我完全迷路了。
问题 -
如何在 numpy 中创建灰度二维白色图像?
为什么使用 cv2.Color 将 numpy 中的 3 通道白色图像转换为灰度图像没有得到白色图像?
使用 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
你会得到 -
当使用颜色图显示二维数组时,matplotlib 将首先 normalize the data 使其位于 0 和 1 之间。
您的白色数组仅由 255 组成,在尝试对等值数组进行归一化时,文档指出它们都被转换为 0(见上文 link),导致呈现黑色。要手动指定范围,请使用:
plt.imshow(img, cmap='gray', vmin=0, vmax=255)
您也可以尝试将 img_bw
数组中的第一个像素设置为 <255 的任何值,并使用您原来的方法显示它,您应该会看到一个全白的图像,角落里有一个黑色方块。
至于为什么这个“有效”:
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(黑色),其余白色内部保持白色。
看来我对 numpy 数组中图像的表示方式的理解存在一些根本性的差距。
img = np.ones([100,100,3], dtype=np.uint8)*255
plt.imshow(img)
以上代码创建了一个 "white" 3 通道图像。
每个像素的值为 [255,255,255]
明白了。
现在我想创建一个 "white" 灰度图像。我真的不需要 RGB 通道来存储白色图像,对吗?
img_bw = np.ones([100,100], dtype=np.uint8)*255
plt.imshow(img_bw, cmap = "gray")
即使每个像素位置的值为 255,这也会创建一个 "black image"?
好吧,让我把我之前的 3 通道白色图像转换成灰度图,看看 numpy 数组是什么样子的。
img_bw1 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
plt.imshow(img_bw1, cmap = "gray")
这也给了我一个"black image"?
那么灰度 "white image" 的 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 及以上。
我完全迷路了。
问题 -
如何在 numpy 中创建灰度二维白色图像?
为什么使用 cv2.Color 将 numpy 中的 3 通道白色图像转换为灰度图像没有得到白色图像?
使用 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
你会得到 -
当使用颜色图显示二维数组时,matplotlib 将首先 normalize the data 使其位于 0 和 1 之间。
您的白色数组仅由 255 组成,在尝试对等值数组进行归一化时,文档指出它们都被转换为 0(见上文 link),导致呈现黑色。要手动指定范围,请使用:
plt.imshow(img, cmap='gray', vmin=0, vmax=255)
您也可以尝试将 img_bw
数组中的第一个像素设置为 <255 的任何值,并使用您原来的方法显示它,您应该会看到一个全白的图像,角落里有一个黑色方块。
至于为什么这个“有效”:
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(黑色),其余白色内部保持白色。