網站首頁 編程語言 正文
一、邊緣檢測原理
圖像的邊緣由圖像中兩個相鄰的區域之間的像素集合組成,是指圖像中一個區域的結束和另外一個區域的開始。也可以這么理解,圖像邊緣就是圖像中灰度值發生空間突變的像素的集合。梯度方向和幅度是圖像邊緣的兩個性質,沿著跟邊緣垂直的的方向,像素值的變化幅度比較平緩;而沿著與邊緣平行的方向,則像素值變化幅度變化比較大。于是,根據該變化特性,通常會采用計算一階或者二階導數的方法來描述和檢測圖像邊緣。
基于邊緣檢測的圖像分割方法的基本思路是首先檢測出圖像中的邊緣像素,然后再把這些邊緣像素集合連結在一起便組成所要的目標區域邊界。圖像中的邊緣可以通過對灰度值求導來檢測確定,然而求導數可以通過計算微分算子來實現。在數字圖像處理領域,微分運算通常被差分計算所近似代替。
二、 canny算法原理
在1986年,Canny邊緣檢測算子首次在論文《A Computational Approach to Edge Detection》中提出,目前,Canny邊緣檢測算子已廣泛應用于各種圖像處理視覺系統。由于它是從不同視覺對象中提取有用的結構信息,所以了要處理的數據量大大減少。JOHN CANNY總結出,不同視覺系統對邊緣檢測具有較為類似的要求,所以,發現可以采用一種應用意義廣泛的邊緣檢測技術。
JOHN CANNY采用了如下步驟設計實現了canny算子。
(1)消除噪聲。邊緣檢測的算法的主要思想采用了圖像強度的一階和二階微分運算,但因為導數對噪聲很敏感,所以再求導之前,先對圖像源的數據進行平滑預處理再運用邊緣檢測算法。一般采用濾波器來改善圖像的性噪比。所以Canny算子前,先通過高斯模板對原始數據進行卷積操作來抑制圖像的噪聲,再進行邊緣檢測。
(2)sobel梯度計算:平滑處理完,canny算子利用已有的一階導數sobel微分算子來計算梯度,
Gx表示水平方向X的掩碼模板,Gy表示垂直方向Y的掩碼模板,采用這兩個模板與圖像進行卷積操作可得到圖像邊緣的梯度幅值和方向分別如式(4)和(5)所示:
梯度方向被歸為垂直,水平,和兩個對角線四類,其方向一般總是垂直于邊界。
(3)對梯度幅值進行非極大值抑制。意思是遍歷整個圖像,將某個像素的灰度值與其梯度方向上前后兩個像素的灰度值相比,判斷其是否最大,如果不是那么這個像素值置為0,即不是邊緣;如下圖5. 1所示 ,每一列箭頭的方向代表步驟二所檢測出的(梯度方向與邊緣垂直),數值表示對應的梯度方向的幅值。經過非極大值抑制處理之后,第一列所表示梯度方向的幅值2、4、3被置為0,第二列的所表示梯度方向的幅值3、5、4被置為0,以此類推,最終白色邊框里的幅值5、6、7、6、7被當作疑似邊緣像素點。
(4)使用雙閾值算法檢測和連接邊緣。在上一個步驟得到了存在偽邊緣的邊緣集,因為通過單閾值處理選取邊緣的操作比較難, 所以在Canny算法采用滯后閾值法減少偽邊緣數量。如下圖5. 1所示:Canny使用了滯后閾值,滯后閾值需要高閾值和低閾值,在進行邊緣確定時依據下面的步驟第一,如果某一像素位置的幅值超過高閾值,該像素被保留為邊緣像素:第二,如果某一像素位置的幅值小于低閾值,該像素被排除;第三,如果某一像素位置的幅值在兩個閾值之間,該像素僅僅在連接到一個高于高閾值的像素時被保留。Canny算法的雙閾值中, 大部分噪聲被高閾值檢測出去除了,但是也損失了有用的邊緣信息, 較多的邊緣信息則被低閾值檢測得到的圖像保留著,可取的高與低閾值比在2:1到3:1之間。
圖5. 1非極大值抑制示意圖圖
圖5. 2雙閾值算法檢測示意圖
三、opencv 函數支持Canny()
函數原型:
CV_EXPORTS_W void Canny( InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false );
參數說明:
- image:8位輸入圖像。
- edges:輸出邊緣;單通道8位圖像,與圖像大小相同。
- threshold1:遲滯過程的第一個閾值。
- threshold2:遲滯過程的第二個閾值。
- apertureSize : Sobel算子的孔徑大小。
- L2gradient:一個標志,指示是否應用更精確的方式計算圖像梯度幅值.。
四、代碼示例:
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);
程序運行效果:
原文鏈接:https://blog.csdn.net/weixin_44901043/article/details/123249922
相關推薦
- 2022-10-18 linux下shell腳本備份文件的方法實現_linux shell
- 2022-08-10 C#并行編程Task類用法介紹_C#教程
- 2022-04-26 MFC修改編輯框光標顯示位置方法詳解_C 語言
- 2022-12-24 C#如何優雅的對WinForm窗體應用程序進行權限控制_C#教程
- 2022-01-29 composer 安裝包提示內存不足的解決辦法
- 2022-12-04 使用python下載大型文件顯示進度條和下載時間的操作代碼_python
- 2022-03-29 jquery實現頁面彈球效果_jquery
- 2021-12-02 Centos8搭建配置nis域服務詳細步驟_Linux
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支