【问题标题】:Determine if an image needs contrasting automatically in OpenCV确定图像是否需要在 OpenCV 中自动对比
【发布时间】:2011-01-10 12:27:28
【问题描述】:

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

问题是 - 我如何知道低对比度和高对比度图像之间的区别?

我正在处理灰度图像并正确设置它们的对比度,以便对它们进行阈值处理不会删除我应该提取的文本(那是另一回事)。 欢迎提出建议 - 尤其是关于如何找出图像中的大部分像素是否为浅灰色(这意味着要执行均衡历史) 请帮忙!

编辑:感谢大家提供的许多信息丰富的答案。但标准差计算足以满足我的要求,因此我将其作为我查询的答案。

【问题讨论】:

  • 我需要计算图像的对比度。我通过计算图像的“meanStdDev”来做到这一点。我对吗?有时我得到的 SD 值超过 100。良好对比度的阈值是多少。以及将 SD 转换为 100 的标度的范围是多少。
  • 把 SD 除以 255,因为一个像素的值,假设是 8 位图像,不能超过这个值。然后乘以您合适的比例,例如100. 这称为标准化。休息你可以尝试不同的图像
  • 谢谢,我做到了。好的图像的阈值范围是多少?
  • @2vision2 很抱歉,这不能随便说。最好的事情:您检查几张图像上的值并自己弄清楚!

标签: image-processing opencv


【解决方案1】:

您可能只需对图像进行简单的统计测量即可确定图像是否具有足够的对比度。图像的方差可能是一个很好的起点。如果方差低于某个阈值(需凭经验确定),则可以认为它是“低对比度”。

【讨论】:

  • 对于给定的图像,方差确实会随着对比度的增加而增加,但由于它是一种统计量度,它忽略了图像内的空间关系。因此它可能有时可以作为可靠的对比度指标,但通常不会。
  • @AruniRC 我需要计算图像的对比度。我通过计算图像的“meanStdDev”来做到这一点。我对吗?有时我得到的 SD 值超过 100。良好对比度的阈值是多少。以及将 SD 转换为 100 的标度的范围是多少。
【解决方案2】:

如果您调整对比度只是为了以后可以设置阈值,如果您使用Ohtsu's method 自适应地设置阈值,则可以避免对比度调整步骤。

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

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

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

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

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

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

(stddev: 50.6)

(stddev: 7.9)

这两张图片形成了完美的对比(灰色背景只是为了让它明显是一张图片),但它们的标准偏差(以及方差)完全不同。

【讨论】:

  • 我最初确实应用了 Otsu 的阈值方法,但是文本部分及其背景变黑了。在均衡直方图然后阈值化就可以了。
  • 我删除了我之前的评论——它是意外添加的。局部对比度计算是否让您有所收获?我还没有看到你使用的图像,所以我很难在已经说过的内容之上提出任何建议。如果您发布示例图片,您的问题可能会更容易回答。
  • 抱歉回复晚了(如果你还在的话:P)。目前正在完成轮廓提取编码,之后我将开始对比度调整。具有实验确定的截止值的简单标准开发似乎可行。
【解决方案3】:
  1. 计算图像的cumulative histogram
  2. y(x) = A*x + B 的形式对累积直方图进行线性回归。
  3. 计算RMSEreal_cumulative_frequency(x)-y(x)
  4. 如果 RMSE 接近于零 - 图像已经均衡。 (这意味着对于均衡图像,累积直方图必须是线性的)

想法来自here

编辑: 我已经在 my blog 中说明了这种方法(包括 C 示例代码)。

【讨论】:

  • :: 还不够标准......en.wikipedia.org/wiki/Contrast_(vision)>... 你的 cmets 会很有帮助...
  • 有许多不同的方法来计算对比度。但在我看来,如果 OP 试图发现 cvEqualizeHist() 是否在图像上执行 - 那么您必须考虑 histogram equalization 的细节来检测图像中的该操作(或它不存在)。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2016-08-10
    • 1970-01-01
    • 2019-01-22
    • 2011-09-24
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多