gpt4 book ai didi

python - 使用python仅在R(红色) channel 中显示图像

转载 作者:行者123 更新时间:2023-12-03 16:04:28 29 4
gpt4 key购买 nike

嗨,我是图像处理方面的新手,现在我正在使用 python 处理图像以获得更多洞察力。但是,我对颜色 channel 的理解有点不满意。

在我看来,形状为 (400, 400, 3) 的 RGB 图像意味着图像由 3 个 channel 组成,每个 channel 有 400 * 400 像素。相同位置的三个不同颜色的像素代表整个图像中的一个完整像素。

所以 image[:, :, 0] 代表红色 channel 中的图像。如果我显示它,它应该给出一个全红色的图像。我这样做了,但输出并不理想:

plt.figure(figsize=(15,5))
plt.imshow(im[:,:,0]) # im is the image

抱歉,我还没有足够的信用来上传图像,上面的输出是绿色的,但不是完全绿色。

然后我从其他人那里得到了这个想法,他们将 im[:,:,0] 分配给与图像具有相同形状的零数组。然后输出完全是红色的。代码是:
tmp_im = np.zeros(im.shape, dtype="uint8")
tmp_im[:,:,0] = im[:,:,0]
plt.figure(figsize=(15,5))
plt.imshow(tmp_im)

所以我在想,这两者之间唯一的区别是第一个代码中 imshow() 的参数是 2D,它只包含 R channel 中的元素。但是,第二个是3D,尽管其他两个 channel 中的元素为0。这是导致输出不同的原因吗?

如果我的理解有任何错误,请纠正我。

非常感谢你。

最佳答案

是,对的。在第一种情况下,您从图像和 imshow 中提取一个二维数组。默认情况下应用标准颜色图,viridis afaik,实际上是绿色的。这适用于应该显示为热图的数据数组,但不适用于图片。

另一方面,3D 数组,即具有 RGB 值的数组会被 imshow 自动解释为图像。 .因此,如果在这种情况下只有第一个组件与 0 不同,你会得到一张红色的图片。

但是,您可以强制imshow通过 cmap kwarg 为二维数组使用您选择的颜色图:

plt.imshow(img_name, cmap=cm_name)

cm_name 是其中之一,例如 'Greys''Greys_r'获得图像的灰度表示(或在您的情况下为 R channel )。当然还有 'Reds''Reds_r'可用 - 你猜怎么着...
对于完整列表,只需在 cm_name 中输入拼写错误 - 错误消息非常详细且信息丰富:
Possible values are: Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r, RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral, Spectral_r, Wistia, Wistia_r, YlGn, YlGnBu, YlGnBu_r, YlGn_r, YlOrBr, YlOrBr_r, YlOrRd, YlOrRd_r, afmhot, afmhot_r, autumn, autumn_r, binary, binary_r, bone, bone_r, brg, brg_r, bwr, bwr_r, cividis, cividis_r, cool, cool_r, coolwarm, coolwarm_r, copper, copper_r, cubehelix, cubehelix_r, flag, flag_r, gist_earth, gist_earth_r, gist_gray, gist_gray_r, gist_heat, gist_heat_r, gist_ncar, gist_ncar_r, gist_rainbow, gist_rainbow_r, gist_stern, gist_stern_r, gist_yarg, gist_yarg_r, gnuplot, gnuplot2, gnuplot2_r, gnuplot_r, gray, gray_r, hot, hot_r, hsv, hsv_r, inferno, inferno_r, jet, jet_r, magma, magma_r, nipy_spectral, nipy_spectral_r, ocean, ocean_r, pink, pink_r, plasma, plasma_r, prism, prism_r, rainbow, rainbow_r, seismic, seismic_r, spring, spring_r, summer, summer_r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, terrain, terrain_r, viridis, viridis_r, winter, winter_r

为了显示差异,这里有一个示例图:

enter image description here

使用以下代码创建:
import imageio
import matplotlib.pyplot as plt
import numpy as np
im = imageio.imread('imageio:chelsea.png')
im_r = np.zeros(np.shape(im))
im_r[:, :, 0] = im[:, :, 0]
fig, axs = plt.subplots(2, 2, figsize=(10, 8))
axs[0, 0].imshow(im[:, :, 0])
axs[1, 0].imshow(im[:, :, 0], cmap='Greys_r')
axs[0, 1].imshow(im[:, :, 0], cmap='Reds_r')
axs[1, 1].imshow(im_r.astype(int))
axs[0, 0].set_title('pure imshow of 2D-array (R-channel)')
axs[1, 0].set_title('imshow of 2D-array with cmap="Grey_r"')
axs[0, 1].set_title('imshow of 2D-array with cmap="Reds_r"')
axs[1, 1].set_title('imshow of 3D-array with coordinates 1 and 2 \n(i.e.: channels G and B) set to 0')
plt.tight_layout()

关于python - 使用python仅在R(红色) channel 中显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52632718/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com