OpenCV中的颜色级别

时间:2014-11-13 15:50:28

标签: opencv

我想做一些与levels function in Photoshop类似的事情,但无法找到合适的openCV函数。

基本上我想拉伸图像中的灰色,从几乎白色到几乎黑色,而不是从几乎白色到稍微灰白,而白色和黑色一样留黑色(我使用的是灰度图像)。

3 个答案:

答案 0 :(得分:3)

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

enter image description here

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

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

例如,如果要为灰度图像进行像(a,d)=(10,200),(b,c)=(250,50)这样的变换,

对于x [10,250]

,y = -150 *(x-10)/ 240 + 200

y = x代表[0,10]和(250,255)如果你想保持剩余的值不变。

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

答案 1 :(得分:3)

以下python代码完全实现了Photoshop调整->“色阶”对话框。

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

imgnp.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)

答案 2 :(得分:2)

我不知道“Photoshop等级”是什么。但是从描述来看,我认为你应该尝试以下方法:

  1. 使用cvtColor将图片转换为YUV。 Y代表强度平面。 (您也可以使用Lab,Luv或任何具有单独强度分量的类似色彩空间)。
  2. 使用split拆分飞机,使强度平面成为单独的图像。
  3. 在强度平面上致电equalizeHist
  4. 使用merge
  5. 将飞机合并在一起

    可以找到有关直方图均衡的详细信息here

    还要注意,有一种改进的直方图均衡化方法--CLAHE(但我找不到比this更好的链接的实现,@ berak也提出了关于该主题的好link