溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++ OpenCV如何實現腐蝕與膨脹

發布時間:2021-11-26 10:13:17 來源:億速云 閱讀:467 作者:小新 欄目:大數據

C++ OpenCV如何實現腐蝕與膨脹

在圖像處理中,腐蝕(Erosion)和膨脹(Dilation)是兩種基本的形態學操作。它們通常用于去除噪聲、分割獨立的圖像元素、連接相鄰的元素以及尋找圖像中的明顯極大值或極小值區域。本文將介紹如何使用C++和OpenCV庫來實現腐蝕與膨脹操作。

1. 腐蝕與膨脹的基本概念

1.1 腐蝕(Erosion)

腐蝕操作是通過滑動一個結構元素(通常是一個小的矩形或圓形)在圖像上,并將結構元素覆蓋的像素點的最小值賦給中心像素。腐蝕操作可以消除圖像中的小物體、分離物體以及縮小物體的邊界。

1.2 膨脹(Dilation)

膨脹操作與腐蝕相反,它是通過滑動一個結構元素在圖像上,并將結構元素覆蓋的像素點的最大值賦給中心像素。膨脹操作可以填充物體內部的空洞、連接相鄰的物體以及擴大物體的邊界。

2. OpenCV中的腐蝕與膨脹函數

OpenCV提供了erode()dilate()函數來實現腐蝕和膨脹操作。這兩個函數的原型如下:

void cv::erode(
    InputArray src, 
    OutputArray dst, 
    InputArray kernel, 
    Point anchor = Point(-1,-1), 
    int iterations = 1, 
    int borderType = BORDER_CONSTANT, 
    const Scalar& borderValue = morphologyDefaultBorderValue()
);

void cv::dilate(
    InputArray src, 
    OutputArray dst, 
    InputArray kernel, 
    Point anchor = Point(-1,-1), 
    int iterations = 1, 
    int borderType = BORDER_CONSTANT, 
    const Scalar& borderValue = morphologyDefaultBorderValue()
);

參數說明

  • src: 輸入圖像,通常是二值圖像(黑白圖像)。
  • dst: 輸出圖像,與輸入圖像具有相同的尺寸和類型。
  • kernel: 結構元素,用于定義腐蝕或膨脹的形狀和大小??梢允褂?code>cv::getStructuringElement()函數來創建。
  • anchor: 結構元素的錨點位置,默認值為(-1, -1),表示錨點位于結構元素的中心。
  • iterations: 腐蝕或膨脹操作的迭代次數。
  • borderType: 邊界填充類型,默認值為BORDER_CONSTANT。
  • borderValue: 邊界填充值,默認值為morphologyDefaultBorderValue()。

3. 實現腐蝕與膨脹的步驟

3.1 創建結構元素

在OpenCV中,可以使用cv::getStructuringElement()函數來創建結構元素。該函數的原型如下:

Mat cv::getStructuringElement(
    int shape, 
    Size ksize, 
    Point anchor = Point(-1,-1)
);
  • shape: 結構元素的形狀,可以是MORPH_RECT(矩形)、MORPH_ELLIPSE(橢圓形)或MORPH_CROSS(十字形)。
  • ksize: 結構元素的大小。
  • anchor: 結構元素的錨點位置,默認值為(-1, -1)。

3.2 執行腐蝕與膨脹操作

在創建結構元素后,可以使用erode()dilate()函數來執行腐蝕和膨脹操作。

4. 示例代碼

以下是一個完整的C++ OpenCV示例代碼,展示了如何實現腐蝕與膨脹操作:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // 讀取圖像
    Mat src = imread("input.jpg", IMREAD_GRAYSCALE);
    if (src.empty()) {
        cout << "Could not open or find the image!" << endl;
        return -1;
    }

    // 創建結構元素
    Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));

    // 腐蝕操作
    Mat eroded;
    erode(src, eroded, kernel);

    // 膨脹操作
    Mat dilated;
    dilate(src, dilated, kernel);

    // 顯示結果
    namedWindow("Original", WINDOW_AUTOSIZE);
    namedWindow("Eroded", WINDOW_AUTOSIZE);
    namedWindow("Dilated", WINDOW_AUTOSIZE);

    imshow("Original", src);
    imshow("Eroded", eroded);
    imshow("Dilated", dilated);

    waitKey(0);
    return 0;
}

代碼說明

  1. 讀取圖像: 使用imread()函數讀取圖像,并將其轉換為灰度圖像。
  2. 創建結構元素: 使用getStructuringElement()函數創建一個5x5的矩形結構元素。
  3. 腐蝕操作: 使用erode()函數對圖像進行腐蝕操作,并將結果存儲在eroded矩陣中。
  4. 膨脹操作: 使用dilate()函數對圖像進行膨脹操作,并將結果存儲在dilated矩陣中。
  5. 顯示結果: 使用imshow()函數顯示原始圖像、腐蝕后的圖像和膨脹后的圖像。

5. 運行結果

運行上述代碼后,你將看到三個窗口分別顯示原始圖像、腐蝕后的圖像和膨脹后的圖像。腐蝕操作會使圖像中的物體變小,而膨脹操作會使圖像中的物體變大。

6. 總結

本文介紹了如何使用C++和OpenCV庫實現腐蝕與膨脹操作。通過erode()dilate()函數,可以輕松地對圖像進行形態學操作。腐蝕與膨脹是圖像處理中非?;A且重要的操作,掌握它們對于進一步學習圖像處理技術非常有幫助。

希望本文對你理解和使用OpenCV中的腐蝕與膨脹操作有所幫助!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女