楼主: 时光永痕
714 0

[数据挖掘新闻] 如何将 RGB 图像转换为灰度 [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)八级

11%

威望
0
论坛币
26 个
通用积分
57.2238
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34180 点
帖子
2732
精华
0
在线时间
321 小时
注册时间
2020-7-21
最后登录
2024-8-1

楼主
时光永痕 学生认证  发表于 2022-8-16 16:27:07 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
这篇文章是关于处理彩色和灰度图像的混合,并需要将它们转换成统一的格式——全灰度。我们将使用 Pillow、Numpy 和 Matplotlib 包在 Python 中工作。
有时需要将彩色图像转换为灰度图像。当加载在火星表面拍摄的图像作为,高级神经网络方法的一部分时,就会出现这种需求。我们正在处理彩色和灰度图像的混合,需要将它们转换成统一的格式——全灰度。我们将使用 Pillow、Numpy 和 Matplotlib 包在 Python 中工作。

顺便说一句,这篇文章中所有有趣的信息都来自 于灰度的维基百科条目。


读入彩色图像
使用的 代码 加载 jpeg 图像以供自动编码器用作输入。这是通过使用 Pillow 和 Numpy 完成的:
  1. from PIL import Image
  2. import numpy as np
  3. color_img = np.asarray(Image.open(img_filename)) / 255
复制代码
这会读取图像并将其转换为 Numpy 数组。有关其作用和原因的详细说明,如何将图片转换为数字。对于灰度图像,结果是一个二维数组,其行数和列数等于图像中像素行数和列数。较低的数值表示较深的阴影,较高的数值表示较浅的阴影。像素值的范围通常是 0 到 255。我们除以 255 得到 0 到 1 的范围。

彩色图像表示为三维 Numpy 数组 - 三个二维数组的集合,每个用于红色、绿色和蓝色通道。每一个,就像灰度数组一样,每个像素都有一个值,并且它们的范围是相同的。

three_d_array.png
Easy Peasy:平均频道
将彩色图像 3D 数组转换为灰度 2D 数组的一种直观方法是,对于每个像素,取红色、绿色和蓝色像素值的平均值以获得灰度值。这将  每个色带贡献的亮度或亮度组合成一个合理的灰度近似值。
  1. img = numpy.mean(color_img, axis=2)
复制代码
该 axis=2 参数告诉 numpy.mean() 所有三个颜色通道的平均值。(axis=0 将平均跨像素行并 axis=1 跨像素列平均。)
D3F97E1D-D720-467e-91A3-1BF6AD1B467E.png

嗯,实际上……依赖于通道的亮度感知

在我们看来,绿色看起来比蓝色亮十倍。通过多次重复精心设计的实验,心理学家已经弄清楚我们对亮度或红色、绿色和蓝色的感知有多么不同。他们为我们的通道平均提供了一组不同的权重,以获得总亮度。

rgb2gray_eq_linear.png
gray_lin.png
嗯,实际上……伽玛压缩

当亮度较低时,我们能够看到微小的差异,但在高亮度水平下,我们对它们的敏感度要低得多。为了避免在高亮度下表现出难以察觉的差异,色阶被扭曲,以便将更多的值集中在范围的低端,而将它们更广泛地分布在高端。这称为伽马压缩。

要在计算灰度亮度之前撤消伽马压缩的影响,有必要应用逆运算,伽马扩展:

gamma_compression_eq.png
gamma_fcn.png
伽马压缩的好处是它可以消除平滑变化的深色条纹,就像黄昏时的天空照片一样。不利的一面是,如果我们想做诸如添加、减去或平均频带之类的操作,我们首先必须撤消压缩并将亮度恢复为线性表示。
gray_nl.png
考虑到伽马压缩后,整个图像都会变亮。它使亮度与原始图像的亮度更接近。最后,我们有一个高质量的灰度表示。

好吧,实际上……线性近似

与我们之前使用的加权平均值相比,伽马解压缩和重新压缩的计算成本相当高。有时速度比尽可能精确的亮度计算更可取。对于这样的情况,有一个线性近似:

rgb2gray_eq_approx.png
这可以让您获得更接近 gamma 压缩校正版本的结果,但无需额外的计算时间。
gray_approx.png
如您所见,结果一点也不差。它们往往更暗一些,尤其是通过红色的中间值,但可以说在大多数实际方面都一样好。

这种亮度计算方法已编入标准 ITU-R BT.601 Studio 编码参数中,用于标准 4:3 和宽屏幕 16:9 纵横比。 顺便说一句,它在 1983 年获得了艾美奖。

我应该使用哪一个?

如果 close 足够好,或者如果您真的关心速度,请使用伽马校正的线性近似。这是 MATLAB、  Pillow和 OpenCV使用的方法。它包含在我的 Lodgepole 图像和视频处理工具箱中:
  1. import lodgepole.image_tools as lit
  2. gray_img = lit.rgb2gray_approx(color_img)
复制代码
但是,如果您只是必须获得最好的结果,请在整个伽马解压缩 - 感知亮度校正 - 伽马重新压缩管道上挥霍:
  1. import lodgepole.image_tools as lit
  2. gray_img = lit.rgb2gray(color_img)
复制代码
如果在读到这里之后你坚持直接将三个通道平均起来,我会评判你。

现在去制作漂亮的灰度图像!
      相关帖子DA内容精选
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Matplotlib CDA LEVEL filename matplot excel函数

rgb2gray_eq_linear.png (6.71 KB)

rgb2gray_eq_linear.png

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-5 08:19