OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
製作您自己的線性濾波器!

上一教程: 使用 inRange 進行閾值操作
下一教程: 為影像新增邊框

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

目標

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

  • 使用 OpenCV 函式 filter2D() 建立您自己的線性濾波器。

理論

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

相關性

從非常廣泛的意義上講,相關性是影像的每個部分與一個運算元(核)之間的操作。

什麼是核?

核本質上是一個固定大小的數值係數陣列,以及該陣列中的一個錨點,錨點通常位於中心。

核相關性是如何工作的?

假設您想知道影像中某個特定位置的最終值。相關性的值按以下方式計算:

  1. 將核錨點放置在特定畫素上方,核的其餘部分覆蓋影像中相應的區域性畫素。
  2. 將核係數乘以相應的影像畫素值並求和結果。
  3. 將結果放置在輸入影像中錨點的位置。
  4. 透過在整個影像上掃描核,對所有畫素重複此過程。

將上述過程用方程表示,我們得到:

\[H(x,y) = \sum_{i=0}^{M_{i} - 1} \sum_{j=0}^{M_{j}-1} I(x+i - a_{i}, y + j - a_{j})K(i,j)\]

幸運的是,OpenCV 為您提供了 filter2D() 函式,因此您無需編寫所有這些操作的程式碼。

該程式的作用是什麼?

  • 載入影像
  • 執行歸一化盒式濾波器。例如,對於大小為 \(size = 3\) 的核,核將是:

    \[K = \dfrac{1}{3 \cdot 3} \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}\]

程式將使用大小為 3、5、7、9 和 11 的核執行濾波操作。

  • 濾波器的輸出(使用每個核)將顯示 500 毫秒。

程式碼

本教程的程式碼如下所示。

解釋

載入影像

初始化引數

迴圈

執行一個無限迴圈,更新核大小並將線性濾波器應用於輸入影像。讓我們更詳細地分析一下。

  • 首先,我們定義濾波器將使用的核。如下所示:

第一行是將 kernel_size 更新為範圍 \([3,11]\) 內的奇數值。第二行透過將其值設定為一個由 \(1\) 填充的矩陣併除以元素數量進行歸一化來實際構建核。

  • 設定核之後,我們可以使用函式 filter2D() 生成濾波器。
  • 引數表示:
    • src:源影像
    • dst:目標影像
    • ddepth: dst 的深度。負值(例如 \(-1\))表示深度與源影像相同。
    • kernel: 將在影像上掃描的核。
    • anchor: 錨點相對於其核的位置。預設情況下,位置 Point(-1, -1) 表示中心。
    • delta: 在相關性計算過程中要新增到每個畫素的值。預設情況下為 \(0\)。
    • BORDER_DEFAULT: 我們將此值設為預設(更多詳細資訊請參見後續教程)
  • 我們的程式將執行一個 while 迴圈,每 500 毫秒更新一次濾波器核的大小,範圍如上所示。

結果

  1. 編譯上述程式碼後,您可以執行它,並將影像路徑作為引數。結果將是一個視窗,顯示一個被歸一化濾波器模糊的影像。每 0.5 秒,核大小都會改變,如下面的系列快照所示。