我想做一些与levels function in Photoshop类似的事情,但无法找到合适的openCV函数。
基本上我想拉伸图像中的灰色,从几乎白色到几乎黑色,而不是从几乎白色到稍微灰白,而白色和黑色一样留黑色(我使用的是灰度图像)。
答案 0 :(得分:3)
我认为这是一个将输入电平映射到输出电平的函数,如下图所示。
例如,橙色曲线是从(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 + 200y = x代表[0,10]和(250,255)如果你想保持剩余的值不变。
您可以在OpenCV( LUT 功能)中使用查找表来计算输出级别,并将此转换应用于您的图像或特定通道。您可以通过这种方式应用任何分段转换。
答案 1 :(得分:3)
以下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)
答案 2 :(得分:2)