python - 使用粗略的灰度算法有问题吗?

标签 python algorithm python-imaging-library image-conversion image-comparison

所以我正在设计一些程序来使用 PILpython 中编辑照片,其中一个是将图像转换为灰度(我避免使用PIL 中的任何函数)。

我使用的算法很简单:对于每个像素(颜色深度为 24),我计算了 RGB 值并将 RGB 值设置为此平均值。

我的程序正在生成看起来准确的灰度图像,但我想知道我是否使用了正确的算法,我遇到了 this answer一个问题,似乎“正确”的算法是计算 0.299 R + 0.587 G + 0.114 B

我决定将我的程序与这个算法进行比较。我使用我的程序生成了一个灰度图像,另一个(使用相同的输入)来自 a website online ('image to grayscale' 的最高 Google 结果。

在我的肉眼看来,它们似乎完全一样,如果有任何差异,我是看不到的。但是,我决定使用 this website ('compare two images online' 的最佳 Google 结果)来比较我的灰度图像。事实证明,在像素深处,它们有轻微的变化,但没有人一眼就能察觉到的变化(可以发现差异,但通常只有当图像相互叠加或在几毫秒内切换时) .

我的问题(第一个是主要问题):

  1. 使用我的“粗略”灰度算法有什么缺点吗?
  2. 有没有人有任何输入图像,我的灰度算法会产生与“正确”的图像明显不同的图像?
  3. 是否有任何颜色/RBG 组合不适用于我的算法?

我的关键代码(如果需要):

def greyScale(pixelTuple):
    return tuple([round(sum(pixelTuple) / 3)] * 3)

“正确”算法(似乎偏重于绿色):

def greyScale(pixelTuple):
    return tuple([round(0.299 * pixelTuple[0] + 0.587 * pixelTuple[1] + 0.114 * pixelTuple[2])] * 3)

我的输入图像: My input image

我的算法生成的灰度图像: The greyscale image my algorithm produces

“正确”的灰度图像: The greyscale image which is 'correct'

在线比较灰度图像时(红色突出显示的差异,使用 10% 的模糊度): When the greyscale images are compared online (highlighted red are the differences, using a fuzz of 10%)

尽管上面突出显示的像素有所不同,但上面的灰度图像看起来几乎完全相同(至少在我看来)。

另外,关于我的第一个问题,如果有人感兴趣,this site对不同的灰度转换算法做了一些分析,也有一些自定义算法。

编辑:

针对@Szulat 的回答,我的算法实际上 生成了这个图像(忽略错误的裁剪,原始图像有三个圆圈,但我只需要第一个):

This is what my algorithm **actually** produces

如果人们想知道转换为灰度的原因是什么(因为算法似乎取决于目的),我只是在 python 中制作了一些简单的照片编辑工具,以便我可以拥有一个迷你 Photoshop 并且不需要依赖互联网来应用滤镜和效果。

赏金的原因:这里的不同答案涵盖了不同的事情,这些都是相关且有用的。这使得很难选择接受哪个答案。我开始赏金是因为我喜欢这里列出的一些答案,但也因为有一个答案可以涵盖这个问题所需的所有内容。

最佳答案

这些图像看起来非常相似,但你的眼睛可以分辨出区别,特别是如果你把一个放在另一个位置上:

enter image description here

例如,您可以注意到背景中的花朵在平均转换中看起来更亮。

这并不是说平均三个 channel 有什么本质上的“坏”。该公式的原因是我们对红色、绿色和蓝色的感知不同,因此它们对灰度图像中强度的贡献不应该相同;由于我们对绿色的感知更强烈,因此绿色像素在灰度上应该看起来更亮。但是,as commented by Mark没有唯一完美的灰度转换,因为我们看到的是彩色,而且在任何情况下每个人的视觉都略有不同,所以任何公式都会尝试做出近似,这样像素强度对大多数人来说都是“正确的”。

关于python - 使用粗略的灰度算法有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51818193/

相关文章:

Python复制具有相同ID值的行

python - 捕捉负面前瞻

algorithm - 比较五个不同的来源

html - Bokeh - 如何让悬停工具仅适用于特定点?

python - 从 numpy 数组转换为 PIL 图像 python 后图像颜色发生变化

python - 属性错误: 'module' object has no attribute 'Graph'

python - Matlab 中的稀疏矩阵向量乘法比 Python 更快吗?

algorithm - 什么样的算法? (背包,垃圾桶!?)

python - 删除其中有 2 个连续元音的单词

python - 使用 virtualenv 或 buildout 安装 PIL 的问题