OpenCV中的颜色级别

OpenCV中的颜色级别,opencv,Opencv,我想做一些类似的事情,但找不到正确的openCV函数 基本上,我希望将图像中的灰色从几乎白色延伸到几乎黑色,而不是从几乎白色延伸到稍微灰色,同时将白色保留为白色,黑色保留为黑色(我使用的是灰度图像)。我不知道什么是“Photoshop级别”。但根据描述,我认为您应该尝试以下方法: 使用将图像转换为YUV。Y将表示强度平面。(也可以使用Lab、Luv或任何具有单独强度分量的类似颜色空间) 使用分割平面,使强度平面成为单独的图像 在飞机上呼叫 使用将平面合并到一起 有关直方图均衡化的详细信息,请参见

我想做一些类似的事情,但找不到正确的openCV函数

基本上,我希望将图像中的灰色从几乎白色延伸到几乎黑色,而不是从几乎白色延伸到稍微灰色,同时将白色保留为白色,黑色保留为黑色(我使用的是灰度图像)。

我不知道什么是“Photoshop级别”。但根据描述,我认为您应该尝试以下方法:

  • 使用将图像转换为YUV。Y将表示强度平面。(也可以使用Lab、Luv或任何具有单独强度分量的类似颜色空间)
  • 使用分割平面,使强度平面成为单独的图像
  • 在飞机上呼叫
  • 使用将平面合并到一起
  • 有关直方图均衡化的详细信息,请参见


    还请注意,有一个改进的直方图均衡化方法的实现——CLAHE(但我找不到比@berak建议的更好的链接)

    我认为这是一个将输入级别映射到输出级别的函数,如下图所示

    例如,橙色曲线是从(a,c)到(b,d)的直线,蓝色曲线是从(a,d)到(b,c)的直线,绿色曲线是从(a,c)到(b,d)的非线性函数

    我们可以将蓝色曲线定义为(x-a)/(y-d)=(a-b)/(d-c)。 a、b、c和d的限制值取决于应用此转换的通道所支持的范围。对于灰度,这是[0255]

    例如,如果要对灰度图像进行(a,d)=(10200),(b,c)=(250,50)等变换

    y=-150*(x-10)/240+200表示x[10250]

    y=x表示[0,10]和(250,255],如果希望保持其余值不变


    您可以使用OpenCV(LUT函数)中的查找表来计算输出级别,并将此转换应用于图像或特定通道。您可以通过这种方式应用任何分段转换。

    以下python代码完全实现Photoshop调整->级别对话框

    将每个通道的值更改为所需的值

    img
    np.uint8
    类型的输入rgb图像

    inBlack  = np.array([0, 0, 0], dtype=np.float32)
    inWhite  = np.array([255, 255, 255], dtype=np.float32)
    inGamma  = np.array([1.0, 1.0, 1.0], dtype=np.float32)
    outBlack = np.array([0, 0, 0], dtype=np.float32)
    outWhite = np.array([255, 255, 255], dtype=np.float32)
    
    img = np.clip( (img - inBlack) / (inWhite - inBlack), 0, 255 )                            
    img = ( img ** (1/inGamma) ) *  (outWhite - outBlack) + outBlack
    img = np.clip( img, 0, 255).astype(np.uint8)
    

    没错。OpenCV更好!=)等等,如果photoshop不是OpenCV,这能解释为什么我的代码不能编译吗?可能是CLAHEI丢失的链接,我使用灰度图像,如果这改变了什么的话。我想这意味着我不必转换,拆分然后合并,对吗?只是均衡器。不幸的是均衡器似乎正在吞噬我图像中的一些颜色。以前有几个色调的浅灰色,现在只有黑色和很少色调的深灰色,所以我不能用它。重复一遍,你也可以尝试使用CLAHE,它是全局直方图均衡化的“自适应”替代方法。那么,查找表就是了。我希望会有一个不涉及他们的答案。这是正确的答案。使用inBlack和outBlack值就足以获得所需的效果。谢谢@iperov!