OpenCV有一个方便的cvEqualizeHist()函数,适用于褪色/低对比度图像。 然而,当给出已经高对比度的图像时,结果是低对比度的图像。我明白了 - 直方图是均匀分布的。
问题是 - 如何了解低对比度和高对比度图像之间的差异?
我正在操作灰度图像并正确设置它们的对比度,以便对它们进行阈值处理不会删除我应该提取的文本(这是一个不同的故事)。 建议欢迎 - 尤其是如何查看图像中的大多数像素是否为浅灰色(这意味着要执行均衡hist) 请帮忙!
编辑:感谢大家提供了许多丰富的答案。但是标准差计算对我的要求来说已经足够了,因此我将其作为我查询的答案。
答案 0 :(得分:6)
如果您正在调整对比度,以便稍后可以启用阈值,则可以在使用Ohtsu's method自适应地设置阈值时避免对比度调整步骤。
如果您仍然有兴趣找到图像对比度,请继续阅读。
虽然有number of different ways来计算“对比度”。通常,这些指标在本地应用而不是整个图像,以使结果对图像内容更敏感:
从那里,您可以使用许多功能来确定对比度:
与单独的全局图像差异相比,这可以作为图像对比度的更好指示。原因如下:
(stddev:50.6)
(stddev:7.9)
这两幅图像形成鲜明对比(灰色背景只是让它显而易见,它是一幅图像),但它们的标准偏差(以及方差)完全不同。
答案 1 :(得分:5)
您可以只使用图像的简单统计测量来确定图像是否具有足够的对比度。图像的方差可能是一个很好的起点。如果方差低于某个阈值(根据经验确定),那么您可以将其视为“低对比度”。
答案 2 :(得分:3)
y(x) = A*x + B
。real_cumulative_frequency(x)-y(x)
的{{3}}。想法取自RMSE。
修改强> 我在here中已经说明了这种方法(包括C示例代码)。
答案 3 :(得分:0)
skimage 对此提供了支持。 skimage.exposure.is_low_contrast
。 reference
示例:
>>> image = np.linspace(0, 0.04, 100)
>>> is_low_contrast(image)
True
>>> image[-1] = 1
>>> is_low_contrast(image)
True
>>> is_low_contrast(image, upper_percentile=100)
False