问题描述
我遇到了一个函数的两个代码示例片段,这些片段声称分解图像并返回仅具有色相,饱和度和正确值的图像,具体取决于将什么颜色作为参数传递。
def break_down(image,channel):
hsv = color.rgb2hsv(image)
if (channel == "H"):
out = hsv[:,:,0].copy()
if (channel == "S"):
out = hsv[:,1].copy()
if (channel == "V"):
out = hsv[:,2].copy()
return out
def break_down(image,channel):
hsv = color.rgb2hsv(image)
out = hsv.copy()
if (channel == "H"):
out[:,1] = 0
out[:,2] = 0
if (channel == "S"):
out[:,0] = 0
out[:,2] = 0
if (channel == "V"):
out[:,1] = 0
return out
第一个输出为彩色图像(红色/绿色/蓝色)。但是,第二个以黑色/白色/灰色阴影给出输出。我无法理解哪个是正确的代码。可能它们都不准确。
从逻辑上讲,例如当我们仅显示饱和时会发生什么?如果色相是图像的颜色成分,那么返回的图像应该没有颜色,对吗?
解决方法
这实际上不是一个“正确”的问题,它只是您要如何可视化数据的一种选择。
饱和度是[0,1]值,表示颜色与灰色的距离。您可以将[0,1]值可视化为灰度图像,原始图像较灰暗的地方将变暗,而原始图像具有高度饱和的颜色则将变白。这是有用的可视化吗?由您决定。
也许您会发现更直观的方法是通过将S和V强制为1并将图像转换回RGB以显示来可视化H。这样可以显示每个像素的纯色(饱和度和值均为100%)。然后,您可以通过将V强制为1并转换回RGB来一起可视化H,S。这样可以显示每个像素的色相和饱和度(即色度)。如果将其与色相可视化进行比较,则可以开始了解饱和度的含义。