OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
无匹配项
基本阈值处理操作

上一教程: 图像金字塔
下一教程: 使用 inRange 的阈值处理操作

原作者Ana Huamán
兼容性OpenCV >= 3.0

目标

在本教程中,你将学习如何

  • 使用 OpenCV 函数 cv::threshold 执行基本阈值处理操作

理论知识

注意
以下说明出自 Bradski 和 Kaehler 所著之《学习 OpenCV》。

阈值处理是什么?

  • 最简单的分割方法
  • 应用示例:分离图像中对应于我们想要分析对象的区域。这种分离基于对象像素与背景像素之间的强度变化。
  • 为了区分我们感兴趣的像素与其他像素(最终将会被拒绝),我们会将每个像素强度值与阈值(根据要解决的问题确定)进行比较。
  • 一旦我们正确区分了重要的像素,我们可以设置一个确定的值来识别这些像素(即我们可以将它们的值指定为 \(0\)(黑色)、\(255\)(白色)或任何符合你需求的值)。

阈值处理类型

  • OpenCV 提供 cv::threshold 函数来执行阈值处理操作。
  • 我们可以使用此函数进行 \(5\) 种类型的阈值处理操作。我们将在以下小节中解释这些操作。
  • 为了说明这些阈值处理流程如何运作,我们来考虑一个源图像,其中像素的强度值是 \(src(x,y)\)。下图描绘了这一点。水平的蓝线表示阈值 \(thresh\)(固定)。

阈值二值化

  • 此阈值处理操作可以表示为

    \[\texttt{dst} (x,y) = \fork{\texttt{maxVal}}{如果 \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{其他情况}\]

  • 因此,如果像素 \(src(x,y)\) 的强度高于 \(thresh\),则新像素强度设置为 \(MaxVal\)。否则,像素设置为 \(0\)。

阈值二值化、反转

  • 此阈值处理操作可以表示为

    \[\texttt{dst} (x,y) = \fork{0}{如果 \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{maxVal}}{其他情况}\]

  • 如果像素 \(src(x,y)\) 的强度高于 \(thresh\),那么新像素强度被设置为 \(0\)。否则,设置为 \(MaxVal\)。

截断

  • 此阈值处理操作可以表示为

    \[\texttt{dst} (x,y) = \fork{\texttt{threshold}}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\]

  • 如果 \(src(x,y)\) 的最大强度值为 \(thresh\),则其值被截断。参考下图

阈值归零

  • 这个运算可以用以下方式表示:

    \[\texttt{dst} (x,y) = \fork{\texttt{src}(x,y)}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{otherwise}\]

  • 如果 \(src(x,y)\) 低于 \(thresh\),则新的像素值将被设置为 \(0\)。

阈值归零,取反

  • 这个运算可以用以下方式表示:

    \[\texttt{dst} (x,y) = \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\]

  • 如果 \(src(x,y)\) 大于 \(thresh\),则新的像素值将被设置为 \(0\)。

代码

说明

我们来检查一下此程序的总体结构

  • 加载图像。如果图像为 BGR,我们将将其转换为灰度。为此,记住我们可以使用函数 cv::cvtColor
  • 创建一个窗口以显示结果
  • 创建 \(2\) 个轨迹条,以便用户输入内容
    • 阈值化类型:二进制、置零等...
    • 阈值
  • 等待用户输入阈值,阈值化类型(或直到程序退出)
  • 无论何时用户更改任何轨迹栏的值,都将调用函数 Threshold_Demo(在 Java 中为 update

如你所见,会调用函数 cv::threshold。我们提供 C++ 代码中的 \(5\) 个参数

  • src_gray:我们的输入图像
  • dst:目标(输出)图像
  • threshold_value:关于阈值化操作的 \(thresh\) 值
  • max_BINARY_value:与二进制阈值化操作一起使用的值(设置所选像素)
  • threshold_type:\(5\) 个阈值化操作之一。它们在上面函数的注释部分中列出。

结果

  1. 编译此程序后,使用图像路径作为参数运行它。例如,对于输入图像
  1. 首先,我们尝试使用二进制阈值反转对图像进行阈值化。我们希望高于 \(thresh\) 的像素会变暗,这正是实际发生的情况,正如我们在下面的快照中看到的(请注意从原始图像中,狗的舌头和眼睛比图像中的其他部分特别亮,这反映在输出图像中)。
  1. 现在我们尝试阈值归零。这样,我们希望最暗的像素(低于阈值)将变为全黑,而值大于阈值的像素将保持其原始值。下面的输出图像快照对此进行了验证。