OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
重對映

上一個教程: 使用廣義Ballard和Guil霍夫變換進行物件檢測
下一個教程: 仿射變換

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

目標

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

a. 使用OpenCV函式 cv::remap 實現簡單的影像重對映例程。

理論

什麼是影像重對映?

  • 影像重對映是將影像中的畫素從一個位置重新定位到新影像中的另一個位置的過程。
  • 為了完成對映過程,可能需要對非整數畫素位置進行插值,因為源影像和目標影像之間並非總能保持一對一的畫素對應關係。
  • 我們可以將每個畫素位置 \((x,y)\) 的重對映表示為

    \[g(x,y) = f ( h(x,y) )\]

    其中 \(g()\) 是重對映後的影像,\(f()\) 是源影像,\(h(x,y)\) 是作用於 \((x,y)\) 的對映函式。

  • 讓我們看一個快速示例。假設我們有一張影像 \(I\),並且我們想要進行如下重對映:

    \[h(x,y) = (I.cols - x, y )\]

    會發生什麼?很容易看出影像會在 \(x\) 方向上翻轉。例如,考慮輸入影像

觀察紅色圓圈相對於 \(x\)(將 \(x\) 視為水平方向)如何改變位置

  • 在OpenCV中,函式 cv::remap 提供了一個簡單的重對映實現。

程式碼

  • 此程式的作用是什麼?
    • 載入影像
    • 每秒鐘,對影像應用4種不同的重對映過程之一,並在視窗中無限期顯示它們。
    • 等待使用者退出程式

解釋

  • 載入影像

  • 建立目標影像和兩個對映矩陣(用於x和y方向)

  • 建立一個視窗來顯示結果

  • 建立一個迴圈。每隔1000毫秒,我們更新對映矩陣(mat_xmat_y)並將它們應用於源影像。

  • 應用重對映的函式是 cv::remap。我們提供以下引數:

    • src:源影像
    • dst:與 src 大小相同的目標影像
    • map_x:x方向的對映函式。它等同於 \(h(i,j)\) 的第一個分量。
    • map_y:與上述相同,但為y方向。請注意,map_ymap_x 的大小都與 src 相同。
    • INTER_LINEAR:用於非整數畫素的插值型別。這是預設值。
    • BORDER_CONSTANT:預設值

    我們如何更新對映矩陣 mat_xmat_y?請繼續閱讀

  • 更新對映矩陣: 我們將執行4種不同的對映
    1. 將圖片縮小一半並在中間顯示

      \[h(i,j) = ( 2 \times i - src.cols/2 + 0.5, 2 \times j - src.rows/2 + 0.5)\]

      對於所有滿足以下條件的 \((i,j)\) 對:\(\dfrac{src.cols}{4}<i<\dfrac{3 \cdot src.cols}{4}\) 和 \(\dfrac{src.rows}{4}<j<\dfrac{3 \cdot src.rows}{4}\)
    2. 將影像上下顛倒:\(h( i, j ) = (i, src.rows - j)\)
    3. 將影像左右翻轉:\(h(i,j) = ( src.cols - i, j )\)
    4. b和c的組合:\(h(i,j) = ( src.cols - i, src.rows - j )\)

這在以下程式碼片段中表達。其中,map_x 代表 h(i,j) 的第一個座標,map_y 代表第二個座標。

結果

  1. 編譯上述程式碼後,您可以將其作為引數指定影像路徑來執行。例如,使用以下影像:
  1. 這是將其縮小一半並居中後的結果
  1. 上下顛倒
  1. 沿x方向翻轉
  1. 沿兩個方向翻轉