我有一个OpenCV图像,像往常一样在BGR colored颜色 空间中,我需要将它转换为CMYK.我在网上搜索,但基本上只找到了以下方法(略有变化):
def bgr2cmyk(cv2_bgr_image):
bgrdash = cv2_bgr_image.astype(float) / 255.0
# Calculate K as (1 - whatever is biggest out of Rdash, Gdash, Bdash)
K = 1 - numpy.max(bgrdash, axis=2)
with numpy.errstate(divide="ignore", invalid="ignore"):
# Calculate C
C = (1 - bgrdash[..., 2] - K) / (1 - K)
C = 255 * C
C = C.astype(numpy.uint8)
# Calculate M
M = (1 - bgrdash[..., 1] - K) / (1 - K)
M = 255 * M
M = M.astype(numpy.uint8)
# Calculate Y
Y = (1 - bgrdash[..., 0] - K) / (1 - K)
Y = 255 * Y
Y = Y.astype(numpy.uint8)
return (C, M, Y, K)
这很好用,但感觉相当慢--对于800x600px的图像,在我的i7CPU上大约需要30毫秒.对于相同的图像,典型的cv2
操作(如阈值处理和类似操作)只需要几毫秒,所以由于这是所有的numpy
,所以我预计这个CMYK转换会更快.
然而,我还没有发现任何能让这一点显著增加的因素.可以通过PIL.Image
转换为CMYK,但得到的通道看起来与上面列出的算法不同.
还有别的主意吗?