【问题标题】:Grayscale CMYK pixel灰度 CMYK 像素
【发布时间】:2013-02-08 04:51:34
【问题描述】:

我需要将 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 不,最大 CMY 是黑色的,所以在 CMYK 中表示颜色的方法有很多。我的意思是 (1, 1, 1, 0) 和 (0, 0, 0, 1) 理论上是相同的黑色。
  • 是的,但是如果它们是相同的颜色,只使用黑色墨水会节省墨水,不是吗?此外,某些打印机在进行灰度时使用不同的黑色墨水;也许只使用“K”频道可能会触发这个?
  • @Hawken 是的,但问题是关于在 CMYK 中转换图像。而且您不能假设此图像已针对墨水进行了优化。所以如果你有一个 CMY 图像,其中 K 通道是空的,它也应该被正确转换。

标签: colors rgb grayscale cmyk


【解决方案1】:

有几种方法可以将RGB 转换为灰度,其中提到的通道的平均值就是其中之一。使用色彩空间YCbCr 中的Y 通道也是一个常见的选项,以及来自LABL 通道等选项。

根据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_profile,但“简单”的公式也可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 2021-01-16
  • 2012-06-01
  • 2017-11-17
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多