为什么像这样索引图片的 ndarray 会使图片变成绿色和蓝色?
why indexing ndarray of picture like this makes picture green and blue?
import numpy as np
from skimage import io
import matplotlib.pyplot as plt
jeju = io.imread('jeju.jpg')
jeju.shape
> (960,1280,3)
jeju
> Array([[[171, 222, 251],
[172, 223, 252],
[172, 223, 252],
...,
[124, 189, 255],
[121, 189, 254],
[120, 188, 253]],
[[173, 224, 253],
[173, 224, 253],
[173, 224, 253],
...,
[124, 189, 255],
[122, 190, 255],
[121, 189, 254]],
[[174, 225, 254],
[174, 225, 254],
[175, 226, 255]
...,
[125, 190, 255],
[122, 190, 255],
[122, 190, 255]],
...,
[[ 66, 93, 26],
[ 89, 114, 46],
[ 49, 72, 2],
...,
[ 2, 29, 0],
[ 34, 59, 17],
[ 40, 63, 21]],
[[ 44, 71, 4],
[ 23, 50, 0],
[ 29, 52, 0],
...,
[ 40, 67, 22],
[ 0, 19, 0],
[ 16, 41, 0]],
[[ 29, 58, 0],
[ 44, 71, 2],
[ 84, 110, 37],
...,
[ 17, 44, 1],
[ 33, 60, 17],
[ 18, 43, 1]]], dtype=uint8)
plt.imshow(jeju)
plt.imshow(jeju[:,:,0])
jeju[:,:,0]
>Array([[171, 172, 172, ..., 124, 121, 120],
[173, 173, 173, ..., 124, 122, 121],
[174, 174, 175, ..., 125, 122, 122],
...,
[ 66, 89, 49, ..., 2, 34, 40],
[ 44, 23, 29, ..., 40, 0, 16],
[ 29, 44, 84, ..., 17, 33, 18]], dtype=uint8)
---------------------------------------------
如上,我从目录中读取图片并对其进行索引,使图片变红。
因为 jeju.shape
中的 (960, 1280, 3) 是 (height,width,rgb) 并且我认为如果我使用 [:,:,0]
,0 表示红色。(我认为 r=0,g=1, b=2)
但结果不是红色图片,而是充满绿色和蓝色的图片。
为什么会发生这件事? [:,:,0]
是什么意思?
你说得对,它代表的是红色通道。但是,官方文档中的函数 imshow 指出,对于二维数组,使用归一化和颜色映射将值映射到颜色。
如果你只想绘制你的红色通道,你可以这样做
red_image = np.zeros(np.shape(jeju))
red_image[:, :, 0] = jeju[:, :, 0]
plt.imshow(red_image.astype('uint8'))
import numpy as np
from skimage import io
import matplotlib.pyplot as plt
jeju = io.imread('jeju.jpg')
jeju.shape
> (960,1280,3)
jeju
> Array([[[171, 222, 251],
[172, 223, 252],
[172, 223, 252],
...,
[124, 189, 255],
[121, 189, 254],
[120, 188, 253]],
[[173, 224, 253],
[173, 224, 253],
[173, 224, 253],
...,
[124, 189, 255],
[122, 190, 255],
[121, 189, 254]],
[[174, 225, 254],
[174, 225, 254],
[175, 226, 255]
...,
[125, 190, 255],
[122, 190, 255],
[122, 190, 255]],
...,
[[ 66, 93, 26],
[ 89, 114, 46],
[ 49, 72, 2],
...,
[ 2, 29, 0],
[ 34, 59, 17],
[ 40, 63, 21]],
[[ 44, 71, 4],
[ 23, 50, 0],
[ 29, 52, 0],
...,
[ 40, 67, 22],
[ 0, 19, 0],
[ 16, 41, 0]],
[[ 29, 58, 0],
[ 44, 71, 2],
[ 84, 110, 37],
...,
[ 17, 44, 1],
[ 33, 60, 17],
[ 18, 43, 1]]], dtype=uint8)
plt.imshow(jeju)
plt.imshow(jeju[:,:,0])
jeju[:,:,0]
>Array([[171, 172, 172, ..., 124, 121, 120],
[173, 173, 173, ..., 124, 122, 121],
[174, 174, 175, ..., 125, 122, 122],
...,
[ 66, 89, 49, ..., 2, 34, 40],
[ 44, 23, 29, ..., 40, 0, 16],
[ 29, 44, 84, ..., 17, 33, 18]], dtype=uint8)
---------------------------------------------
如上,我从目录中读取图片并对其进行索引,使图片变红。
因为 jeju.shape
中的 (960, 1280, 3) 是 (height,width,rgb) 并且我认为如果我使用 [:,:,0]
,0 表示红色。(我认为 r=0,g=1, b=2)
但结果不是红色图片,而是充满绿色和蓝色的图片。
为什么会发生这件事? [:,:,0]
是什么意思?
你说得对,它代表的是红色通道。但是,官方文档中的函数 imshow 指出,对于二维数组,使用归一化和颜色映射将值映射到颜色。
如果你只想绘制你的红色通道,你可以这样做
red_image = np.zeros(np.shape(jeju))
red_image[:, :, 0] = jeju[:, :, 0]
plt.imshow(red_image.astype('uint8'))