OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
基本閾值操作

上一個教程: 影像金字塔
下一個教程: 使用 inRange 進行閾值操作

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

目標

在本教程中,您將學習如何

理論基礎

注意
以下解釋來自Bradski和Kaehler的著作Learning OpenCV

閾值化?

  • 最簡單的分割方法
  • 應用示例:將影像中對應我們想要分析的物件的區域分離出來。這種分離是基於物件畫素和背景畫素之間強度的變化。
  • 為了區分我們感興趣的畫素與其餘畫素(最終將被拒絕),我們將每個畫素的強度值與一個閾值(根據待解決的問題確定)進行比較。
  • 一旦我們正確分離了重要畫素,我們可以給它們設定一個確定的值來標識它們(例如,我們可以給它們分配 \(0\)(黑色)、\(255\)(白色)或任何適合您需求的值)。

閾值化型別

  • OpenCV提供了函式 cv::threshold 來執行閾值操作。
  • 我們可以使用此函式執行 \(5\) 種類型的閾值操作。我們將在以下小節中解釋它們。
  • 為了說明這些閾值處理的工作原理,我們假設有一個源影像,其畫素強度值為 \(src(x,y)\)。下圖描繪了這一點。水平藍線表示閾值 \(thresh\)(固定)。

二值閾值化

  • 此閾值操作可表示為

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

  • 因此,如果畫素 \(src(x,y)\) 的強度高於 \(thresh\),則新的畫素強度設定為 \(MaxVal\)。否則,畫素設定為 \(0\)。

反向二值閾值化

  • 此閾值操作可表示為

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

  • 如果畫素 \(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}\]

  • 畫素的最大強度值為 \(thresh\),如果 \(src(x,y)\) 更大,則其值被截斷。見下圖

取零閾值化

  • 此操作可表示為

    \[\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. 現在我們嘗試使用取零閾值化。我們預期最暗的畫素(低於閾值)將完全變為黑色,而值大於閾值的畫素將保持其原始值。這由輸出影像的以下快照驗證。