python - 在 numpy 中创建 "white"图像(二维图像)

标签 python numpy opencv image-processing scikit-image

看来我对 numpy 数组中图像的表示方式的理解似乎存在一些根本性的差距。

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

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

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

明白了。

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

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

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

好吧,让我把我之前的 3 channel 白色图像转换成灰度图,看看 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 channel 白色图像转换为灰度图像没有得到白色图像?

最佳答案

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

您的白色数组仅由 255 组成,在尝试规范化等值数组时,文档指出它们都被转换为 0(见上面的链接),导致呈现黑色。要手动指定范围,请使用:

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

您还可以尝试将 img_bw 数组中的第一个像素设置为任何值 <255 并使用您原来的方法来显示它,您应该会看到一个全白的图像,角落里有一个黑色方 block .


至于为什么这“有效”:

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(黑色),而白色内部的其余部分保持白色。

关于python - 在 numpy 中创建 "white"图像(二维图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49217587/

相关文章:

python - Apache arrow,零拷贝的 numpy 数组对齐

python - Matplotlib - 不同时刻特定轮廓的图例

opencv - 如何修复HOG以检测场景中的所有人?

opencv - 将数据从 Mat/oclMat 传输到 cl_mem (OpenCV + OpenCL)

python - 使用 getattr [ python ] 在实例上调用方法

python - 使用 torch.autocast 时,如何强制各个图层 float 32

python - 编写一个脚本,使用postfix进行内容过滤

python,循环嵌套,函数,if语句

python - 我应该使用 numpy 作为图像处理程序吗?为什么

c++ - OpenCV C++ : error: 'it' does not name a type