确定图像是否需要在OpenCV中自动对比

时间:2011-01-10 12:27:29

标签: image-processing opencv

OpenCV有一个方便的cvEqualizeHist()函数,适用于褪色/低对比度图像。  然而,当给出已经高对比度的图像时,结果是低对比度的图像。我明白了 - 直方图是均匀分布的。

问题是 - 如何了解低对比度和高对比度图像之间的差异?

我正在操作灰度图像并正确设置它们的对比度,以便对它们进行阈值处理不会删除我应该提取的文本(这是一个不同的故事)。    建议欢迎 - 尤其是如何查看图像中的大多数像素是否为浅灰色(这意味着要执行均衡hist)  请帮忙!

编辑:感谢大家提供了许多丰富的答案。但是标准差计算对我的要求来说已经足够了,因此我将其作为我查询的答案。

4 个答案:

答案 0 :(得分:6)

如果您正在调整对比度,以便稍后可以启用阈值,则可以在使用Ohtsu's method自适应地设置阈值时避免对比度调整步骤。

如果您仍然有兴趣找到图像对比度,请继续阅读。

虽然有number of different ways来计算“对比度”。通常,这些指标在本地应用而不是整个图像,以使结果对图像内容更敏感:

  • 将图像划分为相邻的非重叠邻域。
  • 选择与图像要素大小相近的邻域大小(例如,如果您的主要特征是水平文本,则使邻域足够高以捕获2行文本,并且同样宽)。
  • 将指标单独应用于每个社区
  • 将度量标准结果阈值分隔为低和高方差块。这样可以防止诸如页面空白区域偏大的对比度估计值。

从那里,您可以使用许多功能来确定对比度:

  • 高度量块与低度量块的比例
  • 高度量块意味着
  • 高度量块和低度量块之间的强度距离(使用均值,模式等)

与单独的全局图像差异相比,这可以作为图像对比度的更好指示。原因如下:

alt text(stddev:50.6)

alt text(stddev:7.9)

这两幅图像形成鲜明对比(灰色背景只是让它显而易见,它是一幅图像),但它们的标准偏差(以及方差)完全不同。

答案 1 :(得分:5)

您可以只使用图像的简单统计测量来确定图像是否具有足够的对比度。图像的方差可能是一个很好的起点。如果方差低于某个阈值(根据经验确定),那么您可以将其视为“低对比度”。

答案 2 :(得分:3)

  1. 计算图像的cumulative histogram
  2. y(x) = A*x + B
  3. 的形式对累积直方图进行线性回归
  4. 计算real_cumulative_frequency(x)-y(x)的{​​{3}}。
  5. 如果RMSE接近于零 - 图像已经均衡。 (这意味着对于均衡图像,累积直方图必须是线性的)
  6. 想法取自RMSE

    修改 我在here中已经说明了这种方法(包括C示例代码)。

答案 3 :(得分:0)

skimage 对此提供了支持。 skimage.exposure.is_low_contrastreference

示例:

>>> 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