我可以成功地将BGR图像转换为CMYK,并得到一个大小为(height, width, 4)
的数组,4
为C、M、Y和K通道,范围从0到1。
在拆分这个CMYK
数组之后,我有4个大小为(height, width)
的数组,表示每个像素的C、M、Y和K的数量。
如果我只想显示C
(青色)通道为例,我不能使用cv.imshow('Cyan', C)
,因为它给我一个灰度图像,如预期。
那么,如何以青色显示C
C
信道/数组,以及基于C
数组的正确“饱和”量?。
或者,,我如何才能得到显示青色的灰度图像,对于每一个像素都有相同的“饱和度”呢?
编辑:
我的目标是将BGR图像分割成4个通道(C、M、Y和K),给出我应该使用的每个像素的颜色量(青色、品红、黄色或黑色)来表示白色背景上的全色(就像打印机所做的那样)。
实例:
这张图片:
会像这样分开:
这些4‘通道’叠加/画在一个白色的背景上,将提供完整的彩色图像。
因此,我希望能够生成这4幅图像,并知道每个像素所需的每种颜色(青色、品红、黄色、黑色)的数量(用于白色表面的加性着色)。
发布于 2022-06-16 20:09:13
一旦你去了CMYK,你就没有饱和了。为此,您需要HSV并分离S通道。然后,如果您想要在Python OpenCV中使用cyan来着色S通道,可以将蓝色和绿色通道设置为一些固定值,例如255。
输入:
import cv2
import numpy as np
# read image
img = cv2.imread("barn.jpg")
# convert to HSV and get S channel
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
s = hsv[:,:,1]
# make 3 equal channels, then colorize with cyan (blue = green = 255)
s_cyan = cv2.merge([s,s,s])
s_cyan[:,:,0] = 255
s_cyan[:,:,1] = 255
# write results to disk
cv2.imwrite("barn_saturation_cyan.jpg", s_cyan)
# show results
cv2.imshow('s_cyan', s_cyan)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
如果您所说的“饱和”只是指“强度”,那么您可以对CMYK青色通道进行着色,将青色从CMYK图像中分离出来,并在将单个通道图像转换为3个相同通道后,设置蓝色=绿色= 255的相同颜色。
发布于 2022-06-16 23:44:18
这里有两种方法在Python/OpenCV中用青色着色(灰度)青色通道。
方法1:从CMYK颜色空间获取青色通道。将灰度通道转换为3个通道,并设置值为255的蓝色和绿色通道。
方法2:从CMY彩色空间获取青色通道作为浮动。创建相同尺寸和类型的“红色”图像。然后将两者相乘,除以255,将结果反演并转换为uint8。请注意,红色是青色的补体,反向补充它回来。我用了CMY的青色,因为它产生的结果更接近你所显示的。从https://en.wikipedia.org/wiki/CMYK_color_model看青色与CMY和CMYK的差异
import cv2
import numpy as np
#Method 1
# read cyan image from CMYK separation as grayscale
gray = cv2.imread("skyline_cyan.jpg", cv2.IMREAD_GRAYSCALE)
hh, ww = gray.shape[:2]
# colorize with cyan
gray3 = cv2.merge([gray,gray,gray])
result1 = gray3.copy()
result1[:,:,0] = 255
result1[:,:,1] = 255
# write results to disk
cv2.imwrite("skyline_cyan_result1.jpg", result1)
# show results
cv2.imshow('grayscale cyan from cmyk', gray)
cv2.imshow('result1', result1)
cv2.waitKey(0)
cv2.destroyAllWindows()
# Method 2
# read cyan image from CMY separation as float grayscale
gray = cv2.imread("skyline_cyan2.jpg", cv2.IMREAD_GRAYSCALE).astype(np.float32)
hh, ww = gray.shape[:2]
# create red color image as float
red = np.full((hh,ww,3), (0,0,255), dtype=np.float32)
# multiply gray3 with cyan
gray3 = cv2.merge([gray,gray,gray])
result2 = cv2.multiply(gray3, red)/255
result2 = result2.astype(np.uint8)
result2 = 255 - result2
# write results to disk
cv2.imwrite("skyline_cyan_result2.jpg", result2)
# show results
cv2.imshow('grayscale cyan from cmy', gray.astype(np.uint8))
cv2.imshow('result2', result2)
cv2.waitKey(0)
cv2.destroyAllWindows()
投入(C来自CMYK):
用方法1着色:
投入(C来自CMY):
用方法2着色:
为了完整起见,下面是用方法2对CMYK中的青色进行着色的结果:
https://stackoverflow.com/questions/72651206
复制相似问题