首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用OpenCV显示单个频道的颜色(而不是灰度)

用OpenCV显示单个频道的颜色(而不是灰度)
EN

Stack Overflow用户
提问于 2022-06-16 19:50:49
回答 2查看 394关注 0票数 1

我可以成功地将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幅图像,并知道每个像素所需的每种颜色(青色、品红、黄色、黑色)的数量(用于白色表面的加性着色)。

EN

回答 2

Stack Overflow用户

发布于 2022-06-16 20:09:13

一旦你去了CMYK,你就没有饱和了。为此,您需要HSV并分离S通道。然后,如果您想要在Python OpenCV中使用cyan来着色S通道,可以将蓝色和绿色通道设置为一些固定值,例如255。

输入:

代码语言:javascript
运行
复制
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的相同颜色。

票数 2
EN

Stack Overflow用户

发布于 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的差异

代码语言:javascript
运行
复制
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中的青色进行着色的结果:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72651206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档