欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

opencv?canny邊緣檢測(cè)算法詳解

 更新時(shí)間:2022年03月16日 09:54:29   作者:liu_jie_bin  
本文主要介紹了opencv?canny邊緣檢測(cè)算法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、邊緣檢測(cè)原理

圖像的邊緣由圖像中兩個(gè)相鄰的區(qū)域之間的像素集合組成,是指圖像中一個(gè)區(qū)域的結(jié)束和另外一個(gè)區(qū)域的開(kāi)始。也可以這么理解,圖像邊緣就是圖像中灰度值發(fā)生空間突變的像素的集合。梯度方向和幅度是圖像邊緣的兩個(gè)性質(zhì),沿著跟邊緣垂直的的方向,像素值的變化幅度比較平緩;而沿著與邊緣平行的方向,則像素值變化幅度變化比較大。于是,根據(jù)該變化特性,通常會(huì)采用計(jì)算一階或者二階導(dǎo)數(shù)的方法來(lái)描述和檢測(cè)圖像邊緣。

基于邊緣檢測(cè)的圖像分割方法的基本思路是首先檢測(cè)出圖像中的邊緣像素,然后再把這些邊緣像素集合連結(jié)在一起便組成所要的目標(biāo)區(qū)域邊界。圖像中的邊緣可以通過(guò)對(duì)灰度值求導(dǎo)來(lái)檢測(cè)確定,然而求導(dǎo)數(shù)可以通過(guò)計(jì)算微分算子來(lái)實(shí)現(xiàn)。在數(shù)字圖像處理領(lǐng)域,微分運(yùn)算通常被差分計(jì)算所近似代替。

二、 canny算法原理

在1986年,Canny邊緣檢測(cè)算子首次在論文《A Computational Approach to Edge Detection》中提出,目前,Canny邊緣檢測(cè)算子已廣泛應(yīng)用于各種圖像處理視覺(jué)系統(tǒng)。由于它是從不同視覺(jué)對(duì)象中提取有用的結(jié)構(gòu)信息,所以了要處理的數(shù)據(jù)量大大減少。JOHN CANNY總結(jié)出,不同視覺(jué)系統(tǒng)對(duì)邊緣檢測(cè)具有較為類(lèi)似的要求,所以,發(fā)現(xiàn)可以采用一種應(yīng)用意義廣泛的邊緣檢測(cè)技術(shù)。
JOHN CANNY采用了如下步驟設(shè)計(jì)實(shí)現(xiàn)了canny算子。

(1)消除噪聲。邊緣檢測(cè)的算法的主要思想采用了圖像強(qiáng)度的一階和二階微分運(yùn)算,但因?yàn)閷?dǎo)數(shù)對(duì)噪聲很敏感,所以再求導(dǎo)之前,先對(duì)圖像源的數(shù)據(jù)進(jìn)行平滑預(yù)處理再運(yùn)用邊緣檢測(cè)算法。一般采用濾波器來(lái)改善圖像的性噪比。所以Canny算子前,先通過(guò)高斯模板對(duì)原始數(shù)據(jù)進(jìn)行卷積操作來(lái)抑制圖像的噪聲,再進(jìn)行邊緣檢測(cè)。

(2)sobel梯度計(jì)算:平滑處理完,canny算子利用已有的一階導(dǎo)數(shù)sobel微分算子來(lái)計(jì)算梯度,

在這里插入圖片描述

Gx表示水平方向X的掩碼模板,Gy表示垂直方向Y的掩碼模板,采用這兩個(gè)模板與圖像進(jìn)行卷積操作可得到圖像邊緣的梯度幅值和方向分別如式(4)和(5)所示:

在這里插入圖片描述

在這里插入圖片描述

梯度方向被歸為垂直,水平,和兩個(gè)對(duì)角線四類(lèi),其方向一般總是垂直于邊界。

(3)對(duì)梯度幅值進(jìn)行非極大值抑制。意思是遍歷整個(gè)圖像,將某個(gè)像素的灰度值與其梯度方向上前后兩個(gè)像素的灰度值相比,判斷其是否最大,如果不是那么這個(gè)像素值置為0,即不是邊緣;如下圖5. 1所示 ,每一列箭頭的方向代表步驟二所檢測(cè)出的(梯度方向與邊緣垂直),數(shù)值表示對(duì)應(yīng)的梯度方向的幅值。經(jīng)過(guò)非極大值抑制處理之后,第一列所表示梯度方向的幅值2、4、3被置為0,第二列的所表示梯度方向的幅值3、5、4被置為0,以此類(lèi)推,最終白色邊框里的幅值5、6、7、6、7被當(dāng)作疑似邊緣像素點(diǎn)。

(4)使用雙閾值算法檢測(cè)和連接邊緣。在上一個(gè)步驟得到了存在偽邊緣的邊緣集,因?yàn)橥ㄟ^(guò)單閾值處理選取邊緣的操作比較難, 所以在Canny算法采用滯后閾值法減少偽邊緣數(shù)量。如下圖5. 1所示:Canny使用了滯后閾值,滯后閾值需要高閾值和低閾值,在進(jìn)行邊緣確定時(shí)依據(jù)下面的步驟第一,如果某一像素位置的幅值超過(guò)高閾值,該像素被保留為邊緣像素:第二,如果某一像素位置的幅值小于低閾值,該像素被排除;第三,如果某一像素位置的幅值在兩個(gè)閾值之間,該像素僅僅在連接到一個(gè)高于高閾值的像素時(shí)被保留。Canny算法的雙閾值中, 大部分噪聲被高閾值檢測(cè)出去除了,但是也損失了有用的邊緣信息, 較多的邊緣信息則被低閾值檢測(cè)得到的圖像保留著,可取的高與低閾值比在2:1到3:1之間。

在這里插入圖片描述

圖5. 1非極大值抑制示意圖圖

在這里插入圖片描述

圖5. 2雙閾值算法檢測(cè)示意圖

三、opencv 函數(shù)支持Canny()

函數(shù)原型:

CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,
                         double threshold1, double threshold2,
                         int apertureSize = 3, bool L2gradient = false );

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

  • image:8位輸入圖像。
  • edges:輸出邊緣;單通道8位圖像,與圖像大小相同。
  • threshold1:遲滯過(guò)程的第一個(gè)閾值。
  • threshold2:遲滯過(guò)程的第二個(gè)閾值。
  • apertureSize : Sobel算子的孔徑大小。
  • L2gradient:一個(gè)標(biāo)志,指示是否應(yīng)用更精確的方式計(jì)算圖像梯度幅值.。

四、代碼示例:

    cv::Mat src;
    src = cv::imread("D:\\QtProject\\Opencv_Example\\canny\\canny.jpg", cv::IMREAD_GRAYSCALE);
    if (src.empty()) {
        cout << "matTemplate Cannot load image" << endl;
        return;
    }
    cv::imshow("src", src);

    cv::Mat matCanny;
    const int lowThreshold = 10;
    const int maxThreshold = 200;
    const int kernel_size = 3;
    cv::Canny(src, matCanny, lowThreshold, maxThreshold, kernel_size);
    cv::imshow("matCanny", matCanny);

程序運(yùn)行效果:

在這里插入圖片描述

 到此這篇關(guān)于opencv canny邊緣檢測(cè)算法詳解的文章就介紹到這了,更多相關(guān)opencv canny邊緣檢測(cè)算法 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 手動(dòng)實(shí)現(xiàn)把python項(xiàng)目發(fā)布為exe可執(zhí)行程序過(guò)程分享

    手動(dòng)實(shí)現(xiàn)把python項(xiàng)目發(fā)布為exe可執(zhí)行程序過(guò)程分享

    這篇文章主要介紹了手動(dòng)實(shí)現(xiàn)把python項(xiàng)目發(fā)布為exe可執(zhí)行程序過(guò)程分享,本文使用C語(yǔ)言實(shí)現(xiàn)了一個(gè)簡(jiǎn)潔的Python打包程序,需要的朋友可以參考下
    2014-10-10
  • python字典的setdefault的巧妙用法

    python字典的setdefault的巧妙用法

    這篇文章主要介紹了python字典的setdefault的巧妙用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python?selenium?webdriver?基本使用代碼分享

    Python?selenium?webdriver?基本使用代碼分享

    這篇文章主要介紹了Python?selenium?webdriver?基本使用,本文僅僅簡(jiǎn)單介紹了selenium的使用常用代碼分享,需要的朋友可以參考下
    2022-11-11
  • 在python的WEB框架Flask中使用多個(gè)配置文件的解決方法

    在python的WEB框架Flask中使用多個(gè)配置文件的解決方法

    所謂配置文件管理,就是在不改變?cè)创a的前提下,擁有兩套(甚至多套)配置文件,分別用于開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境,通過(guò)命令行選擇配置文件
    2014-04-04
  • 利用Python編寫(xiě)本地音樂(lè)播放器

    利用Python編寫(xiě)本地音樂(lè)播放器

    這篇文章主要介紹了利用Python編寫(xiě)本地音樂(lè)播放器,主要以分享完整源碼展開(kāi)文章內(nèi)容,具有一的參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03
  • 創(chuàng)建Shapefile文件并寫(xiě)入數(shù)據(jù)的例子

    創(chuàng)建Shapefile文件并寫(xiě)入數(shù)據(jù)的例子

    今天小編就為大家分享一篇?jiǎng)?chuàng)建Shapefile文件并寫(xiě)入數(shù)據(jù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Python流程控制語(yǔ)句的深入講解

    Python流程控制語(yǔ)句的深入講解

    這篇文章主要給大家介紹了關(guān)于Python流程控制語(yǔ)句的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Python解析Laravel?Cookie技巧示例

    Python解析Laravel?Cookie技巧示例

    本文將介紹如何使用Python解析Laravel Cookie,以便在Web開(kāi)發(fā)中處理這些Cookie數(shù)據(jù),我們將深入了解Cookie的結(jié)構(gòu),以及如何在Python中對(duì)其進(jìn)行解析和操作
    2023-12-12
  • Python plt.boxplot函數(shù)及其參數(shù)使用小結(jié)

    Python plt.boxplot函數(shù)及其參數(shù)使用小結(jié)

    plt.boxplot函數(shù)用于繪制箱線圖,本文介紹了Python plt.boxplot函數(shù)及其參數(shù)使用小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • python中設(shè)置超時(shí)跳過(guò),超時(shí)退出的方式

    python中設(shè)置超時(shí)跳過(guò),超時(shí)退出的方式

    今天小編就為大家分享一篇python中設(shè)置超時(shí)跳過(guò),超時(shí)退出的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12

最新評(píng)論