我是Python OpenCV的新手。我看过一些文档和答案here,但我无法弄清楚下面的代码是什么意思:
if (self.array_alpha is None):
self.array_alpha = np.array([1.25])
self.array_beta = np.array([-100.0])
# add a beta value to every pixel
cv2.add(new_img, self.array_beta, new_img)
# multiply every pixel value by alpha
cv2.multiply(new_img, self.array_alpha, new_img)
我知道Basically, every pixel can be transformed as X = aY + b where a and b are scalars.
。基本上,我已经理解了这一点。但是,我不明白的代码,以及如何增加对比度与此。
到目前为止,我已经设法简单地使用img = cv2.imread('image.jpg',0)
读取图像
谢谢你的帮助
7条答案
按热度按时间o4hqfura1#
我想推荐一个使用LAB color space的方法。
LAB颜色空间表示跨三个通道的颜色变化。一个亮度通道和两个颜色通道:
在下面,我在L通道上执行自适应直方图均衡化,并将结果图像转换回BGR颜色空间。这增强了亮度,同时也限制了对比灵敏度。我使用OpenCV 3.0.0和Python完成了以下操作:
代码:
结果:
增强图像在右边
您可以按原样运行代码。要了解CLAHE(对比度有限自适应直方图均衡)是什么,请参阅此维基百科页面
pw136qt22#
对于Python,我还没有找到一个提供对比的OpenCV函数。正如其他人所建议的,有一些技术可以使用非常简单的公式自动增加对比度。
在official OpenCV docs中,建议使用此公式同时应用对比度和亮度:
new_img = alpha*old_img + beta
其中α对应于对比度,β是亮度。不同的案子
在C/C++中,你可以使用cv::Mat::convertTo来实现这个等式,但是我们不能从Python中访问这个库。在Python中,我建议使用cv::addWeighted函数,因为它很快,并且会自动强制输出范围为0到255(例如:对于24位彩色图像,每通道8位)。你也可以使用
convertScaleAbs
,就像@nathancy建议的那样。上面的公式和代码写起来很快,并且会对亮度和对比度进行更改。但它们产生的结果与照片编辑程序有显着不同。这个答案的其余部分将产生一个结果,该结果将再现GIMP中的行为以及LibreOffice的亮度和对比度。这是更多的代码行,但它给出了一个很好的结果。
对比度
在the GIMP中,对比度级别从-127到+127。我修改了公式from here以适应这个范围。
f = 131*(对比度+127)/(127*(131-对比度))
new_image = f*(old_image - 127)+ 127 = f*(old_image)+ 127*(1-f)
为了弄清楚亮度,我弄清楚了亮度和水平之间的关系,并使用了这个水平帖子中的信息来得出解决方案。
Python和OpenCV中的亮度和对比度
把所有这些放在一起,并使用来自USC SIPI的参考“mandrill”图像添加:
我在GIMP中手动处理了图像,并在Python/OpenCV中添加了文本标签:
注意:@UtkarshBhardwaj建议Python 2.x用户必须将对比度校正计算代码转换为float,以获得浮点结果,如下所示:
oxcyiej73#
对比度和亮度可以分别使用alpha(
α
)和beta(β
)进行调整。这些变量通常称为 * 增益 * 和 * 偏置 * 参数。表达式可以写成OpenCV已经将其实现为
cv2.convertScaleAbs()
,只需提供用户定义的alpha
和beta
值之前
->
之后**注意:**要自动调整亮度/对比度,请查看automatic contrast and brightness adjustment of a color photo
4ioopgfo4#
这里有很多答案,从简单到复杂。我想在更简单的一面添加另一个,对于实际的对比度和亮度调整似乎更实用一点。
我们通过
addWeighted()
函数进行a*x+b
调整。然而,为了在不修改亮度的情况下改变对比度,数据需要以零为中心。OpenCV的默认数据类型是uint8,情况并非如此。因此,我们还需要根据分布如何移位来调整亮度。sbdsn5lh5#
关于
X = aY + b
(实际上是f(x) = ax + b
)的最佳解释见https://math.stackexchange.com/a/906280/357701一个简单的一个,通过调整亮度/亮度/亮度的对比度如下:
gzjq41n46#
bjp0bcyl7#
引用自enter link description here
我们必须计算由以下公式给出的对比度校正因子。
为了使算法正确工作,对比度校正因子(F)值必须存储为浮点数,而不是整数。公式中的C值表示所需的对比度水平。
下一步骤是执行实际的对比度调节本身。以下公式显示了对颜色的红色分量所做的对比度调整:
truncate函数仅确保红色、绿色和蓝色的新值在0和255之间的有效范围内。
对比度值将在-255至+255的范围内。负值将减少对比度的量,相反,正值将增加对比度的量。
在这里,您将对比度设置为-128(降低)和+128(增加)。
结果: