灰度CMYK像素

3

我需要将一个CMYK图像转换成灰度的CMYK图像。起初,我认为可以使用与RGB->灰度转换相同的方法,如(R + G + B)/ 3或max(r,g,b)/ 2 + min(r,g,b)。但不幸的是,这对于CMYK效果不佳,因为CMY和K是冗余的。并且黑色的cmyk(0,0,0,255)会变成64。我应该只使用

int grayscaled = max((c + m + y) / 3, k)

或许更加困难?我不确定,因为CMYK实际上是一种冗余的颜色模型,同一种颜色可以通过不同方式进行编码。


如果您想获取灰度图像,输出难道不只是K通道吗?我不太理解CMYK,请告诉我是否有误。 - Hawken
@Hawken 不是的,CMY 的最大值也是黑色,因此有很多种方法可以用 CMYK 表示颜色。我是说 (1, 1, 1, 0) 和 (0, 0, 0, 1) 在理论上是相同的黑色。 - AvrDragon
如果它们是相同颜色,仅使用黑墨水可以节省墨水,不是吗?此外,某些打印机在进行灰度处理时使用不同的黑色油墨;也许仅使用“K”通道可能会触发这种情况。 - Hawken
@Hawken 是的,但问题是关于将图像转换为CMYK格式。而且你不能假设这个图像是针对油墨进行了优化。因此,如果你有一个CMY图像,其中K通道为空,它也应该被正确地转换。 - AvrDragon
1个回答

4
有几种方法将 RGB 转换为灰度图像,其中之一是使用通道的平均值。使用从颜色空间 YCbCrY 通道也是常见选项,还有从 LAB 中的 L 通道等其他选项。

根据http://www.easyrgb.com/index.php?X=MATH中提到的公式,将 CMYK 转换为 RGB 是经济实惠的,然后可以使用众所周知的方法转换为灰度图像。假设 cmyk 在 [0,1] 范围内,我们可以将其转换为灰度亮度值:

def cmyk_to_luminance(c, m, y, k):
    c = c * (1 - k) + k
    m = m * (1 - k) + k
    y = y * (1 - k) + k

    r, g, b = (1 - c), (1 - m), (1 - y)
    y = 0.299 * r + 0.587 * g + 0.114 * b
    return y

请参见http://en.wikipedia.org/wiki/Grayscale了解更多关于转换为灰度的信息。

实际上,将CMYK转换为RGB并不那么容易,并且需要ICC配置文件,但“简单”的公式也基本可行。 - AvrDragon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接