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

c/c++的opencv實(shí)現(xiàn)圖片膨脹

 更新時(shí)間:2025年05月31日 10:16:30   作者:whoarethenext  
圖像膨脹是形態(tài)學(xué)操作,通過(guò)結(jié)構(gòu)元素?cái)U(kuò)張亮區(qū)填充孔洞、連接斷開(kāi)部分、加粗物體,OpenCV的cv::dilate函數(shù)實(shí)現(xiàn)該操作,本文就來(lái)介紹一下opencv?圖片膨脹,感興趣的可以了解一下

圖像膨脹 (Dilation) 是形態(tài)學(xué)圖像處理中的另一種基本操作,與腐蝕操作相對(duì)應(yīng)。它通常用于填充圖像中的小孔洞、連接斷開(kāi)的物體部分、以及加粗二值圖像中的物體。本文將詳細(xì)介紹膨脹的原理,并演示如何使用 C++ 和 OpenCV 庫(kù)來(lái)實(shí)現(xiàn)圖像膨脹。

什么是圖像膨脹?

與腐蝕類似,圖像膨脹也是用一個(gè)特定的結(jié)構(gòu)元素(核)“探測(cè)”或“掃描”輸入圖像的過(guò)程。對(duì)于二值圖像,如果結(jié)構(gòu)元素下的至少一個(gè)像素為前景像素(通常為白色,值為1或255),則輸出圖像中結(jié)構(gòu)元素錨點(diǎn)對(duì)應(yīng)的像素就被置為前景像素。對(duì)于灰度圖像,輸出像素的值是結(jié)構(gòu)元素覆蓋區(qū)域內(nèi)所有像素的最大值。

簡(jiǎn)單來(lái)說(shuō),膨脹操作會(huì):

  • 擴(kuò)大 亮色區(qū)域(前景)。
  • 縮小 暗色區(qū)域(背景)。
  • 填充前景物體內(nèi)的小孔洞或斷裂。

其效果就像是用結(jié)構(gòu)元素“膨脹”或“擴(kuò)張”前景物體的邊界。

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

結(jié)構(gòu)元素在膨脹操作中的作用與在腐蝕操作中類似,它定義了操作的鄰域范圍和形狀。結(jié)構(gòu)元素的中心點(diǎn)通常被稱為“錨點(diǎn)”。OpenCV 提供了 cv::getStructuringElement() 函數(shù)來(lái)方便地創(chuàng)建常見(jiàn)的結(jié)構(gòu)元素。

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

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

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

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

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

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

OpenCV 提供了 cv::dilate() 函數(shù)來(lái)實(shí)現(xiàn)圖像膨脹。

函數(shù)原型:

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

參數(shù)說(shuō)明:

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

C++ 代碼示例

下面是一個(gè)完整的 C++ 示例,演示了如何加載圖像并對(duì)其進(jìn)行膨脹操作:

#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); // 或者 cv::IMREAD_GRAYSCALE 用于灰度圖

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

    // 2. 創(chuàng)建膨脹后的輸出圖像
    cv::Mat dilatedImage;

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

    // 使用一個(gè)簡(jiǎn)單的 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 會(huì)默認(rèn)使用一個(gè) 3x3 的矩形核
    // cv::Mat element; // 使用默認(rèn) 3x3 核

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

    // 5. 顯示原始圖像和膨脹后的圖像
    cv::imshow("原始圖像", srcImage);
    cv::imshow("膨脹后的圖像", dilatedImage);

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

    return 0;
}

編譯和運(yùn)行說(shuō)明 (以 g++ 為例):

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

(請(qǐng)確保你已安裝 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" 替換為實(shí)際的圖像文件路徑。對(duì)于二值化操作,通常先轉(zhuǎn)換為灰度圖再進(jìn)行閾值化處理,然后進(jìn)行膨脹。
  • srcImage.empty(): 檢查圖像是否成功加載。
  • cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)): 創(chuàng)建一個(gè) 5x5 大小的矩形結(jié)構(gòu)元素。你可以修改形狀 (MORPH_ELLIPSE, MORPH_CROSS) 和大小 (cv::Size) 來(lái)觀察不同的效果。
  • cv::dilate(srcImage, dilatedImage, element, cv::Point(-1,-1), iterations): 對(duì) srcImage 應(yīng)用膨脹操作,使用 element 作為結(jié)構(gòu)元素,迭代 iterations 次,并將結(jié)果存儲(chǔ)在 dilatedImage 中。cv::Point(-1,-1) 表示錨點(diǎn)在核的中心。
  • cv::imshow(): 顯示原始圖像和處理后的圖像。
  • cv::waitKey(0): 等待用戶按下任意鍵。
  • cv::destroyAllWindows(): 關(guān)閉所有 OpenCV 創(chuàng)建的窗口。

膨脹的效果和應(yīng)用場(chǎng)景

  • 填充物體內(nèi)的小孔洞: 對(duì)于二值圖像中前景物體內(nèi)部的小黑色區(qū)域(“胡椒噪聲”中的“胡椒”點(diǎn)),膨脹操作可以有效填充。
  • 連接斷開(kāi)的物體部分: 如果物體的不同部分之間存在小的間隙,膨脹可以使它們連接起來(lái)。
  • 加粗或增大物體: 使二值圖像中前景物體的尺寸變大,線條變粗。
  • 平滑物體邊界: 可以使物體邊界更加平滑,填補(bǔ)一些小的凹陷。
  • 在其他更復(fù)雜形態(tài)學(xué)操作(如閉運(yùn)算、梯度計(jì)算)中作為基礎(chǔ)步驟。

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

  • 結(jié)構(gòu)元素的大小:
    • 較小的結(jié)構(gòu)元素產(chǎn)生的膨脹效果較弱。
    • 較大的結(jié)構(gòu)元素產(chǎn)生的膨脹效果較強(qiáng),會(huì)更顯著地?cái)U(kuò)大物體或填充孔洞。
  • 結(jié)構(gòu)元素的形狀:
    • 不同的形狀會(huì)以不同的方式擴(kuò)張物體。例如,水平線核會(huì)主要在水平方向上膨脹物體。
  • 迭代次數(shù) (iterations):
    • 增加迭代次數(shù)會(huì)增強(qiáng)膨脹效果,多次小核迭代的效果類似于使用一個(gè)更大的結(jié)構(gòu)元素。

膨脹與腐蝕

膨脹和腐蝕是形態(tài)學(xué)操作中的一對(duì)對(duì)偶操作。

  • 腐蝕會(huì)“收縮”或“細(xì)化”物體。
  • 膨脹會(huì)“擴(kuò)張”或“加粗”物體。

它們經(jīng)常組合使用:

  • 開(kāi)運(yùn)算 (Opening): 先腐蝕后膨脹,可以用來(lái)去除小對(duì)象(噪聲)、平滑較大對(duì)象的輪廓以及斷開(kāi)細(xì)的連接。
  • 閉運(yùn)算 (Closing): 先膨脹后腐蝕,可以用來(lái)填充小孔洞、連接鄰近的對(duì)象以及平滑較大對(duì)象的輪廓。

總結(jié)

圖像膨脹是形態(tài)學(xué)圖像處理中一個(gè)非常重要的工具,它通過(guò)擴(kuò)展圖像中的亮區(qū)來(lái)達(dá)到填充孔洞、連接物體和加粗特征等目的。通過(guò)精心選擇結(jié)構(gòu)元素的形狀、大小以及迭代次數(shù),可以有效地控制膨脹操作的效果。OpenCV 的 cv::dilate() 函數(shù)為我們提供了一個(gè)簡(jiǎn)單易用的接口來(lái)實(shí)現(xiàn)這一功能。希望本文能幫助你理解和應(yīng)用圖像膨脹技術(shù)。

到此這篇關(guān)于c/c++的opencv實(shí)現(xiàn)圖片膨脹的文章就介紹到這了,更多相關(guān)opencv 圖片膨脹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++算術(shù)運(yùn)算符與類型轉(zhuǎn)換

    C++算術(shù)運(yùn)算符與類型轉(zhuǎn)換

    這篇文章主要介紹了C++算術(shù)運(yùn)算符與類型轉(zhuǎn)換,C++當(dāng)中提供5種基礎(chǔ)的算術(shù)運(yùn)算符,分別是加法、減法、乘法、除法和取模。下main我們就一起來(lái)看看下面文章得具體舉例與說(shuō)明,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-11-11
  • MFC程序執(zhí)行過(guò)程深入剖析

    MFC程序執(zhí)行過(guò)程深入剖析

    這篇文章主要介紹了MFC程序執(zhí)行過(guò)程,包括對(duì)MFC執(zhí)行流程的分析以及斷點(diǎn)調(diào)試分析出的SDI程序執(zhí)行流程,需要的朋友可以參考下
    2014-09-09
  • C++你可能不知道地方小結(jié)

    C++你可能不知道地方小結(jié)

    c++中編譯器替我們完成了許多事情,我們可能不知道,但也可能習(xí)以為常
    2013-01-01
  • C語(yǔ)言算法練習(xí)之佩奇借書(shū)

    C語(yǔ)言算法練習(xí)之佩奇借書(shū)

    這篇文章主要該大家分享C語(yǔ)言佩奇借書(shū)的練習(xí),文章主要通過(guò)描述佩奇借書(shū)的問(wèn)題然后確定程序框架將結(jié)果運(yùn)算出來(lái),下面來(lái)看詳細(xì)內(nèi)容吧,需要的朋友可以參考一下
    2022-03-03
  • 基于C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理信息系統(tǒng)設(shè)計(jì)

    基于C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理信息系統(tǒng)設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理信息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 矩陣的行主序與列主序的分析

    矩陣的行主序與列主序的分析

    這篇文章主要介紹了矩陣的行主序與列主序的分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C語(yǔ)言算法練習(xí)之打魚(yú)還是曬網(wǎng)

    C語(yǔ)言算法練習(xí)之打魚(yú)還是曬網(wǎng)

    這篇文章主要該大家分享C語(yǔ)言打魚(yú)還是曬網(wǎng)的練習(xí),文章主要通過(guò)三天打魚(yú)兩天曬網(wǎng)的俗語(yǔ)提出問(wèn)題,在某一天輪到打魚(yú)還是曬網(wǎng),下面來(lái)看詳細(xì)內(nèi)容吧,需要的朋友可以參考一下
    2022-03-03
  • C++中的opeartor?new和placement?new使用步驟

    C++中的opeartor?new和placement?new使用步驟

    這篇文章主要介紹了C++中的opeartor?new和placement?new詳解,在很多情況下,placement?new的使用方法和其他普通的new有所不同。這里提供了它的使用步驟,需要的朋友可以參考下
    2022-10-10
  • c++基礎(chǔ)語(yǔ)法:普通繼承

    c++基礎(chǔ)語(yǔ)法:普通繼承

    基類成員的private成員不但對(duì)于對(duì)象是不可見(jiàn)的,對(duì)于派生類也是不可見(jiàn)的,只能被基類成員或者友元訪問(wèn)
    2013-09-09
  • C++?線段樹(shù)原理與實(shí)現(xiàn)示例詳解

    C++?線段樹(shù)原理與實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了C++?線段樹(shù)原理與實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論

香格里拉县| 高陵县| 博白县| 观塘区| 惠安县| 莱芜市| 西林县| 合肥市| 监利县| 望谟县| 许昌县| 旬邑县| 鄄城县| 平湖市| 衡山县| 五指山市| 宜兰县| 宁武县| 雷波县| 许昌市| 遂平县| 舞阳县| 天祝| 兰考县| 永春县| 桦甸市| 介休市| 辛集市| 文登市| 洛川县| 巴彦淖尔市| 天津市| 泰安市| 广东省| 太康县| 临潭县| 隆化县| 凤凰县| 华坪县| 志丹县| 菏泽市|