最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c/c++中opencv實現(xiàn)腐蝕的示例代碼

 更新時間:2025年06月03日 10:16:16   作者:whoarethenext  
圖像腐蝕是形態(tài)學(xué)圖像處理中的一種基本操作,OpenCV的cv::erode函數(shù)實現(xiàn)該功能,具有一定的參考價值,感興趣的了解一下

圖像腐蝕 (Erosion) 是形態(tài)學(xué)圖像處理中的一種基本操作。它通常用于去除圖像中的小型噪聲、分離連接的物體以及細化二值圖像中的物體。本文將詳細介紹腐蝕的原理,并演示如何使用 C++ 和 OpenCV 庫來實現(xiàn)圖像腐蝕。

什么是圖像腐蝕?

圖像腐蝕可以被看作是用一個特定的結(jié)構(gòu)元素(也稱為核或掩模)“探測”或“掃描”輸入圖像的過程。對于二值圖像,如果結(jié)構(gòu)元素下的所有像素都為前景像素(通常為白色,值為1或255),則輸出圖像中結(jié)構(gòu)元素錨點對應(yīng)的像素才被置為前景像素,否則置為背景像素(通常為黑色,值為0)。對于灰度圖像,輸出像素的值是結(jié)構(gòu)元素覆蓋區(qū)域內(nèi)所有像素的最小值。

簡單來說,腐蝕操作會:

  • 縮小 亮色區(qū)域(前景)。
  • 擴大 暗色區(qū)域(背景)。
  • 消除小的、孤立的亮色噪點。

其效果就像是用結(jié)構(gòu)元素“腐蝕”掉前景物體的邊界。

結(jié)構(gòu)元素 (Kernel)

結(jié)構(gòu)元素是一個小的二值矩陣(或灰度矩陣),它定義了腐蝕操作的鄰域范圍和形狀。結(jié)構(gòu)元素的中心點通常被稱為“錨點”。OpenCV 提供了 cv::getStructuringElement() 函數(shù)來方便地創(chuàng)建常見的結(jié)構(gòu)元素。

常用的結(jié)構(gòu)元素形狀包括:

  • cv::MORPH_RECT: 矩形
  • cv::MORPH_ELLIPSE: 橢圓形
  • cv::MORPH_CROSS: 十字形
// 創(chuàng)建一個 5x5 大小的矩形結(jié)構(gòu)元素
cv::Mat kernel_rect = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));

// 創(chuàng)建一個 5x5 大小的橢圓形結(jié)構(gòu)元素
cv::Mat kernel_ellipse = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5));

// 創(chuàng)建一個 5x5 大小的十字形結(jié)構(gòu)元素
cv::Mat kernel_cross = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(5, 5));

結(jié)構(gòu)元素的大小和形狀對腐蝕結(jié)果有顯著影響。

OpenCV 中的 cv::erode() 函數(shù)

OpenCV 提供了 cv::erode() 函數(shù)來實現(xiàn)圖像腐蝕。

函數(shù)原型:

void cv::erode(
    cv::InputArray src,         // 輸入圖像
    cv::OutputArray dst,        // 輸出圖像
    cv::InputArray kernel,      // 用于腐蝕的結(jié)構(gòu)元素
    cv::Point anchor = cv::Point(-1,-1), // 結(jié)構(gòu)元素內(nèi)錨點的位置。默認值 (-1,-1) 表示錨點在核中心。
    int iterations = 1,         // 腐蝕操作迭代次數(shù)
    int borderType = cv::BORDER_CONSTANT, // 像素外推方法
    const cv::Scalar& borderValue = cv::morphologyDefaultBorderValue() //邊界不變時的邊界值
);

參數(shù)說明:

  • src: 輸入圖像,可以是任意通道數(shù)的圖像,但深度應(yīng)為 CV_8UCV_16UCV_16SCV_32F 或 CV_64F。
  • dst: 輸出圖像,與 src 具有相同的大小和類型。
  • kernel: 結(jié)構(gòu)元素。如果傳入一個空的 cv::Mat(),則默認使用一個 3x3 的矩形核。
  • anchor: 錨點位置。默認值 cv::Point(-1,-1) 表示錨點在結(jié)構(gòu)元素的中心。
  • iterations: 腐蝕操作執(zhí)行的次數(shù)。多次迭代等同于使用一個由原始核通過自身膨脹(相應(yīng)次數(shù))得到的更大的核。
  • borderType: 用于推斷圖像外部像素的邊界模式。
  • borderValue: 當 borderType 為 cv::BORDER_CONSTANT 時使用的邊界值。

C++ 代碼示例

下面是一個完整的 C++ 示例,演示了如何加載圖像并對其進行腐蝕操作:

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

int main(int argc, char** argv) {
    // 1. 加載圖像
    // 將 "your_image_path.png" 替換為你的圖像路徑
    cv::Mat srcImage = cv::imread("your_image_path.png", cv::IMREAD_COLOR);

    // 檢查圖像是否成功加載
    if (srcImage.empty()) {
        std::cerr << "錯誤: 無法加載圖像!" << std::endl;
        return -1;
    }

    // 2. 創(chuàng)建腐蝕后的輸出圖像
    cv::Mat erodedImage;

    // 3. 定義結(jié)構(gòu)元素 (核)
    // 嘗試不同的形狀和大小
    // int erosion_size = 3; // 核大小,可以調(diào)整
    // cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT,
    //                                           cv::Size(2 * erosion_size + 1, 2 * erosion_size + 1),
    //                                           cv::Point(erosion_size, erosion_size));

    // 使用一個簡單的 5x5 矩形核
    cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    // 你也可以嘗試:
    // cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5));
    // cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(5, 5));

    // 如果不指定核,OpenCV 會默認使用一個 3x3 的矩形核
    // cv::Mat element; // 使用默認 3x3 核

    // 4. 執(zhí)行腐蝕操作
    // 可以指定迭代次數(shù),例如 iterations = 2
    int iterations = 1;
    cv::erode(srcImage, erodedImage, element, cv::Point(-1,-1), iterations);

    // 5. 顯示原始圖像和腐蝕后的圖像
    cv::imshow("原始圖像", srcImage);
    cv::imshow("腐蝕后的圖像", erodedImage);

    // 6. 等待用戶按鍵,然后關(guān)閉窗口
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

編譯和運行說明 (以 g++ 為例):

g++ your_source_file.cpp -o erode_example $(pkg-config --cflags --libs opencv4)
./erode_example

(請確保你已安裝 OpenCV 并配置好 pkg-config,如果使用 OpenCV 3,將 opencv4 替換為 opencv)

代碼解析

  • #include <opencv2/opencv.hpp>: 包含了 OpenCV 的主要頭文件。
  • cv::imread("your_image_path.png", cv::IMREAD_COLOR): 加載指定路徑的彩色圖像。你需要將 "your_image_path.png" 替換為實際的圖像文件路徑。
  • srcImage.empty(): 檢查圖像是否成功加載。
  • cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)): 創(chuàng)建一個 5x5 大小的矩形結(jié)構(gòu)元素。你可以修改形狀 (MORPH_ELLIPSEMORPH_CROSS) 和大小 (cv::Size) 來觀察不同的效果。
  • cv::erode(srcImage, erodedImage, element, cv::Point(-1,-1), iterations): 對 srcImage 應(yīng)用腐蝕操作,使用 element 作為結(jié)構(gòu)元素,迭代 iterations 次,并將結(jié)果存儲在 erodedImage 中。cv::Point(-1,-1) 表示錨點在核的中心。
  • cv::imshow(): 顯示原始圖像和處理后的圖像。
  • cv::waitKey(0): 等待用戶按下任意鍵。
  • cv::destroyAllWindows(): 關(guān)閉所有 OpenCV 創(chuàng)建的窗口。

腐蝕的效果和應(yīng)用場景

  • 去除小的獨立噪聲點: 對于二值圖像中的“椒鹽噪聲”中的“鹽”點(孤立的白色像素點),腐蝕操作非常有效。
  • 細化物體輪廓: 使二值圖像中前景物體的尺寸變小,線條變細。
  • 分離物體: 如果兩個物體之間有細微的連接,腐蝕操作可以斷開這些連接,從而將它們分離。
  • 獲取物體的核心區(qū)域: 多次腐蝕可以逐步剝離物體的外層像素,最終得到物體的核心部分。
  • 在其他更復(fù)雜形態(tài)學(xué)操作(如開運算、閉運算)中作為基礎(chǔ)步驟。

可調(diào)整的參數(shù)及其影響

  • 結(jié)構(gòu)元素的大小:
    • 較小的結(jié)構(gòu)元素產(chǎn)生的腐蝕效果較弱,對圖像的改變較小。
    • 較大的結(jié)構(gòu)元素產(chǎn)生的腐蝕效果較強,會更顯著地縮小或消除物體。
  • 結(jié)構(gòu)元素的形狀:
    • 矩形核對水平和垂直方向的腐蝕程度相同。
    • 線型核(例如,一個水平或垂直的細長矩形)會主要在與核垂直的方向上腐蝕物體。例如,水平線核會使物體在垂直方向上變細。
    • 十字形核和橢圓形核根據(jù)其形狀特性進行腐蝕。
  • 迭代次數(shù) (iterations):
    • 增加迭代次數(shù)會增強腐蝕效果,類似于使用一個更大的結(jié)構(gòu)元素(但不完全相同,多次小核迭代與一次大核迭代在邊界處理上可能有細微差別)。

總結(jié)

圖像腐蝕是形態(tài)學(xué)圖像處理中一個強大且基礎(chǔ)的工具。通過選擇合適的結(jié)構(gòu)元素大小、形狀以及迭代次數(shù),可以有效地修改圖像中物體的形狀和大小,以達到去噪、分割和特征提取等目的。OpenCV 的 cv::erode() 函數(shù)為我們提供了一個簡單易用的接口來實現(xiàn)這一功能。鼓勵讀者多多嘗試不同的參數(shù)組合,觀察它們對圖像處理結(jié)果的具體影響。

到此這篇關(guān)于c/c++中opencv實現(xiàn)腐蝕的示例代碼的文章就介紹到這了,更多相關(guān)opencv 腐蝕內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中回調(diào)函數(shù)及函數(shù)指針的實例詳解

    C++中回調(diào)函數(shù)及函數(shù)指針的實例詳解

    這篇文章主要介紹了C++中回調(diào)函數(shù)及函數(shù)指針的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • vscode 配置 C/C++ 編譯環(huán)境的詳細圖文教程

    vscode 配置 C/C++ 編譯環(huán)境的詳細圖文教程

    這篇文章主要介紹了vscode 配置 C/C++ 編譯環(huán)境的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • C++多重繼承及多態(tài)性原理實例詳解

    C++多重繼承及多態(tài)性原理實例詳解

    這篇文章主要介紹了C++多重繼承及多態(tài)性原理實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-07-07
  • C++?vector的常見用法超詳細講解

    C++?vector的常見用法超詳細講解

    這篇文章主要介紹了C++?vector的常見用法,包括C++中vector容器的定義、初始化方法、訪問元素、常用函數(shù)及其時間復(fù)雜度,通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • windows下用c++獲取本機ip地址的三種方法

    windows下用c++獲取本機ip地址的三種方法

    工作過程中遇到一個需求,需要獲取本機ip地址,同時獲取本機網(wǎng)絡(luò)連接情況,即網(wǎng)線是否連接,經(jīng)過多番搜索,本文給大家介紹了3種方案,通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • OpenCV霍夫變換(Hough Transform)直線檢測詳解

    OpenCV霍夫變換(Hough Transform)直線檢測詳解

    這篇文章主要為大家詳細介紹了OpenCV霍夫變換直線檢測的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++容器適配器的概念與示例

    C++容器適配器的概念與示例

    C++?STL(標準模板庫)是一套功能強大的?C++?模板類,提供了通用的模板類和函數(shù),這些模板類和函數(shù)可以實現(xiàn)多種流行和常用的算法和數(shù)據(jù)結(jié)構(gòu),如向量、鏈表、隊列、棧,今天我們來探究一下stl容器適配器的使用吧
    2023-01-01
  • C++空類默認函數(shù)詳細解析

    C++空類默認函數(shù)詳細解析

    如果你只是聲明一個空類,不做任何事情的話,編譯器會自動為你生成一個默認構(gòu)造函數(shù)、一個拷貝默認構(gòu)造函數(shù)、一個默認拷貝賦值操作符和一個默認析構(gòu)函數(shù)
    2013-10-10
  • 輸出1000以內(nèi)的素數(shù)的算法(實例代碼)

    輸出1000以內(nèi)的素數(shù)的算法(實例代碼)

    本篇文章是對輸出1000以內(nèi)的素數(shù)的算法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++之內(nèi)存分區(qū)的實現(xiàn)示例

    C++之內(nèi)存分區(qū)的實現(xiàn)示例

    本文主要介紹了C++之內(nèi)存分區(qū)的實現(xiàn)示例,主要包含了4個區(qū)域,分為代碼區(qū),全局區(qū),棧區(qū)和堆區(qū),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2024-03-03

最新評論

呼玛县| 米林县| 静乐县| 长沙市| 瓮安县| 鄱阳县| 阳原县| 武威市| 神农架林区| 儋州市| 阳原县| 友谊县| 昭平县| 沙雅县| 宁城县| 余干县| 烟台市| 安陆市| 垦利县| 于都县| 威信县| 津南区| 徐水县| 盱眙县| 兰西县| 图木舒克市| 休宁县| 托克托县| 武穴市| 当涂县| 高青县| 潞城市| 丰宁| 西盟| 六枝特区| 合作市| 香港 | 任丘市| 天津市| 内丘县| 闵行区|