OpenCV 中的颜色级别

lei*_*paC 5 opencv

我想做一些类似于Photoshop 中的级别功能的操作,但找不到合适的 openCV 功能。

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

ipe*_*rov 8

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

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

img是输入 rgbnp.uint8类型的图像。

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)
Run Code Online (Sandbox Code Playgroud)


dha*_*hka 4

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

在此输入图像描述

例如,橙色曲线是从 (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) 等变换,

y = -150*(x-10)/240 + 200 对于 x [10, 250]

如果您希望其余值保持不变,则 y = x 对于 [0, 10) 和 (250, 255]。

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