c#用canny算子做邊緣提取_機器視覺學習(三)邊緣檢測

3cff4c318bf4c7b660fc8d31c8c02eaf.png

一、邊緣檢測

二、邊緣檢測流程

三、Canny邊緣檢測


前言

邊緣檢測是圖像處理和計算機視覺中,尤其是特征提取中的一個研究領域。有許多方法用于邊緣檢測,它們的絕大部分可以劃分為兩類:

  • 基于一階導數
    首先計算邊緣強度, 通常用一階導數表示, 例如梯度模,然后,用計算估計邊緣的局部方向, 通常采用梯度的方向,并利用此方向找到局部梯度模的最大值。即:圖像一階導數中的最大和最小值來檢測邊界,通常是將邊界定位在梯度最大的方向。
    一階:Roberts Cross算子,Prewitt算子,Sobel算子, Kirsch算子,羅盤算子;
    基于 零穿越/零交叉 的一類:二階導數
    基于零穿越的方法通過尋找圖像二階導數零穿越來尋找邊界,通常是Laplacian過零點或者非線性差分表示的過零點。
  • 基于二階導數: Marr-Hildreth,在梯度方向的二階導數過零點,Canny算子,Laplacian算子。

一、邊緣檢測

為什么要進行邊緣檢測呢?因為這是穩定的視覺特征,是人類經驗的結果。邊緣檢測的目的是標識數字圖像中亮度變化明顯的點。圖像屬性中的顯著變化通常反映了屬性的重要事件和變化。主要包括:

  • 深度上的不連續(物體處在不同的物平面上);
  • 表面方向不連續(如正方體的不同的兩個面)
  • 物質屬性變化(會導致光的反射系數不同)
  • 場景照明變化(陰影)

8f15aa8374bb8cbb2ce67898e6e4bc17.png

那么,對于下面這張圖像進行邊緣檢測時,沿著這條紅色的水平線,得到其每個像素點上的強度(也就是灰度值),由此可知邊緣就是在像素值發生突變的地方。那么如果從一個信號中找到突變的地方呢?

66c3df836bc4520865a33765b3b83d49.png

637cba8ce00c6b9db654253df0c71a7d.png

顯然,根據數學知識,對信號曲線進行求一階導數,對于邊緣來說,并不需要關注方向,只需要關注極值即可,所以可以通過求導得到邊緣所在位置。由此將這跟紅色的水平線從上至下滑動即可得到整個圖像的豎直方向上的邊緣。

9f23875fa3f3d7edbffca743ce4eea73.png

對于一個二元函數

,響應的的求導公式:

在圖像處理過程中,對于像素值的位置的最小單位是

px,因此令
,使用這種近似來作為點前位置的導數,則有:

其實由這個公式可以看出,就是右面一個像素減去左面一個像素,作為當前位置的導數,這樣簡化之后其實就可以把這個過程使用卷積代替,即卷積核為:這就是檢測豎直方向上邊緣的卷積核。同理也可以得到水平方向上邊緣的卷積核。

5ad44913c89694d8c52f7702d710ef91.png

那么接下來舉個例子,下面這兩個邊緣檢測結果哪個是水平方向卷積核檢測到的?哪個是豎直方向卷積核檢測到的?因為只有水平卷積核檢測的是左右差異較大的像素值,自然而然連成線之后就是豎直方向的線條。

0ac8aea1dcba015da93db1ac332a0898.png

接下來,解釋一下梯度(一維叫導數,高維叫梯度),對于一副圖像的一個像素點

fea1d16286fad30f88430c2bd65c4624.png

對于夾角的計算方式

,而梯度的幅值:

這個幅值越大說面這點附近像素值變化越劇烈,就越有可能是邊緣。

其實梯度對于一副圖像來說就是圖像變化劇烈的方向。而且梯度方向與邊緣是垂直的。

二、邊緣檢測流程

由于在實際應用過程中信號的采集往往伴隨著噪聲的出現,假設有下面這么一個一維信號,很顯然邊緣就在突變的地方。但是由于真實點附近存在噪聲,如果直接使用邊緣濾波器(邊緣卷積)得到的結果會是什么樣?

388bdacb71bc5d879f40dd9c608753de.png

6d8dbcd79f15363068f551547aa06868.png

顯然,通過邊緣檢測器之后得到導數(梯度)是無法確定極大值極小值的,因此無法判斷邊緣位置。所以,往往在進行邊緣檢測前首先要進行濾波。這是因為邊緣檢測算子主要是基于圖像強度的一階導數和二階導數,但是通常情況下導數對噪聲十分敏感,因此必須使用濾波器來進行平滑噪聲。

ff642d421cebc8e2ffb09085406e6e34.png

因此對于一維圖像

使用高斯卷積核
進行濾波, 通過將
(卷積)得到的結果可以看出,最左邊和最右面為什么沒了呢?這就是因為卷積過程中如果不對邊界補充的話,卷積結果相比原來圖像會小一圈。經過高斯卷積之后的圖像就相對平滑很多,在這個基礎上再進行邊緣檢測,得到結果如下。很顯然求極值就十分簡單了。

7c436fabe75232d7932330cc1ea2ef35.png

因此,我們在對圖像進行邊緣檢測前首先用高斯卷積對圖像進行平滑就是了,因為我們也無法確定圖像是否包含噪聲。雖然上面這個過程實現了邊緣檢測,但是在這個過程中使用了兩次卷積,首先是濾波過程的卷積,然后是求導過程的卷積,顯然卷積是十分耗時的,那么能否使用一次卷積完成這個操作呢?

這個公式成立是因此卷積是滿足交換律,結合律和分配率的。所以使用右面的公式,先對高斯卷積核進行求導,這個模板一般比較小,求導也相對簡單,然后再進行卷積。 這樣就能加速運算過程了。

0a3df4c3badab6111ce154e92a60a3fd.png

e4f206aa6c2875fc32947792669df10e.png
這就是高斯卷積核求導之后的三維圖像

雖然,使用平滑對圖像進行去噪,但是它也會模糊圖像,因此我們可以考慮在不同的scale下進行邊緣檢測。也就是選擇響應的窗寬和標準差即可對圖像進行平滑并邊緣檢測,由于窗寬一般默認經驗值

,因此只需要指定參數
即可執行這兩個過程。所以可以考慮使用不用的
在不同的scale下進行邊緣檢測。

因此,接下來對比重新認識一下高斯卷積核與高斯一階導數核的區別:

  • 高斯卷積核(smoothing filters):高斯卷積實際上是濾除高頻信號,是低通濾波器,濾波器模板中的數值沒有負數,而且這些值相加和為1。

d6984cb1eae44df0163af9538178b1ed.png
  • 高斯一階導數核(derivative filters):濾波器模板中的數值一定有負數,而且這些相加為0。

cac2fcdc1d2422414e65861d7f853446.png

總結一下,對于一副圖像進行邊緣檢測的流程

  • 濾波
  • 增強,增強算法可以將圖像灰度點鄰閾強度值有顯著變化的點凸顯出來。
  • 邊緣檢測,經過增強的圖像,往往鄰域中有很多點的梯度值比較大,而在特定應用中,這些點并不是要找的邊緣點,所以應該采用某些方法對這些點進行取舍。實際工程中,常用的方法是通過閾值化的方法進行檢測。

三、Canny邊緣檢測

9cc65aad773a683da54a8360b7f2e9f9.png

對于這樣一張圖像進行邊緣檢測時,首先第一步,對圖像進行濾波處理,然后計算兩個方向的梯度,先計算每個像素點的梯度,然后計算幅值,得到下面這張圖像。

71e36bb98182ea74469858ee60b27826.png

在進行梯度計算時,梯度較大的地方可能是邊緣也有可能是噪聲,雖然已經進行過一次平滑濾波,但是仍然還會有一些高強度的噪聲無法濾除,因此在這里選擇使用閾值對其進行第二次過濾,去除一些梯度相對較小的點。

cda0ee5747b3713e680f17c3534abdd8.png

然而經過閾值處理后,還是會有一些小問題,就是圖像中的邊緣會很寬,這是由于圖像中的邊緣像素值都是緩慢變化的,不會是一個垂直的突變,即使原始圖像中的邊緣是一個垂直的突變,經過高斯平滑之后它就會變得不那么垂直了,所以這就是為什么邊會那么寬。那如何解決呢?

接下來就介紹了一個著名的算法:NMS非極大值抑制。它的一個主要思想就是,首先確定邊上的一個點,然后沿著邊的梯度方向比較跟相鄰點的梯度進行比較,也即是右圖中的

進行比較。如果
最大則保留,如果不是則舍去。

e9b52f578562ffd8209ee99d0d82aa96.png

經過抑制以后:顯然這就細化了很多,但是也會存在一定的問題,比如脖子下面的邊緣消失了,出現了斷斷續續的情況,出現這種情況的原因是什么呢?這是因為設置的閾值太高了,導致這部分梯度被濾除掉了,但是如果閾值設置的較低又會出現很多“假邊”,因此這里需要對剛剛設置閾值過濾這一步進行改進。

2759abab35f3b3d5216881d93920eb7f.png

改進的思路:就是使用雙閾值法,首先使用一個較高的閾值去將那些確定度較高的邊檢測出來,稱為“強邊”,然后再使用一個較小的閾值顯露更多的邊,稱為“弱邊”,此時選擇保留那些跟強邊有連接關系的邊。這個想法就很巧妙。

9bfa61f5ed8d4ec34863aa0cd26ee05c.png
左邊是高閾值,中間是低閾值,右邊是雙閾值

關于Canny邊緣檢測是有嚴格意義上的數學推導的,這個后續補充一下!

我是尾巴~

每日一句毒雞湯:小時候,雖然窮,但是很快樂,現在不同啦,不僅窮,還不快樂。

615aad58572b88d09cf657e642e44cbd.png

本次推薦:fliqlo一款屏保,兼具美觀和使用(看時間):

Fliqlo?fliqlo.en.softonic.com
363f8b14fe0871385e62b4ee68af03d9.png

繼續加油~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276916.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276916.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一個有關Update類型的存儲過程的問題

CREATE PROCEDURE testupdateproc AS declare id int declare trandate datetime declare tranlimit int update test set trandatetrandate, tranlimittranlimit where test.idid GO 存儲過程語句如上,檢查語法是沒有問題的,但是在程序中執行時卻不行…

[20190805]在小程序中使用npm包

小程序是可以使用npm包的 1. 初始化npm;(在項目目錄下輸入) npm init 此時項目文件夾會創建一個配置信息的package.json文件 2. 手動新建node_modules文件夾;(在項目目錄下新建) 3. 安裝npm包; …

bindresult必須在哪個位置_手機視頻剪輯工具哪個好?清爽視頻編輯APP有人推薦嗎?...

作為一個非常喜歡旅游的人,每次出門在外都喜歡發各種照片,以前發照片覺得就能夠表達自己的狀態和心情,但是隨著時間的變化發現,身邊的人都開始喜歡發視頻了。此前在飛機上拍攝了一段覺得不錯的天空視頻,想要制作成短片…

[轉] 能ping通,但不能上網.

一、感染了病毒所致這種情況往往表現在打開IE時,在IE界面的左下框里提示:正在打開網頁,但老半天沒響應。在任務管理器里查看進程,(進入方法,把鼠標放在任務欄上,按右鍵—任務管理器—進程&#…

Gradle打包命令記錄

Gradle打包命令記錄第一種方式:gradle build執行后在在build/lib下生成war包第二種方式:gradle cleangradle --refresh-dependencies assemble

淺談ASP中Web頁面間的數據傳遞

【簡 介】  基于Web的動態網頁設計必會涉及到頁面間的數據傳遞,文章探討了ASP設計中常用的Web頁面間的數據傳遞方式,分析各種數據傳遞方式的使用方法、使用場合及優缺點,其都是設計階段選擇數據傳遞方式考慮的關鍵 往往使用動態網頁技術制作…

變頻電源出現故障了怎么辦,該如何去診斷呢

在變頻電源使用時間過長之后就會出現一些小故障,在出現這些小故障的時候很多人都不知道問題出在哪,今天中港揚盛的技術員教你如何的快速診斷變頻電源的故障方法。只有及時的發現,這樣就能夠有效地去解決變頻電源所出現的故障。下面就是變頻電…

無法訪問你試圖使用的功能所在的網絡位置_[steam實用工具]解決無法訪問商店/社區/好友列表的問題...

[steam實用工具]解決無法訪問商店/社區/好友列表的問題在我們使用steam的過程中,由于某些原因,在訪問商店/社區/好友列表時會被受到限制。針對這種情況,國內的大神些開發出了以下工具來解決我們訪問的難題。本文章中的軟件由“羽翼誠"大…

tomcat6.0+mysql5.0+jdk5.0+myeclipse6.0打造JSP開發平臺

1.下載tomcat6.0(http://tomcat.apache.org/download-60.cgi), mysql5.0(http://download.mysql.cn/src/2006/0710/5543.html), jdk5.0(http://download.mysql.cn/src/2006/0710/5543.html)以及myeclipse6.0(http://www.myeclipseide.com/module-htmlpages-display-pid-4.html)…

程序設計中的感悟

1. 學習應該從基礎打起,不要一開始就嘗試最高深的技術。 2. 每看一本書,不要說這章我以前學習過了,也掌握的很好,因此我可以跳過這一章看更重要的了。 3. 對于作業,遇到不會的盡量不要立刻向別人請教。如果實在解決…

(轉)用Java獲得當前性能信息

(轉)用Java獲得當前性能信息 http://www.blogjava.net/amigoxie/archive/2008/04/30/197564.html在Java中,可以獲得總的物理內存、剩余的物理內存、已使用的物理內存等信息,本例講解如何取得這些信息,并且獲得在Windows下的內存使…

docker wsl2啟動不了_Docker學習筆記

在筆記本上主要還是想以輕量、方便為主,所以采用的是在WSL2中使用docker的這么一個方案。WSL2我筆記本原來是預裝的是WIN10家庭版,需要先升級為專業版,并加入windows預覽體驗計劃。更新完之后,安裝WSL,我選擇的是Ubunt…

暑假集訓-8.06總結

學習內容: 搜索 今日完成題數(不包含多校):4 今日看書情況:15頁 今日心得: 今天學的是搜索,雖然以前學過,但書上講的更具體些, 比如說如何去優化搜索的次數等 英語題目好…

網易馬進:DDB從分布式數據庫到結構化數據中心的架構變遷

導語: 本文根據馬進老師在2018年5月10日【第九屆中國數據庫技術大會(DTCC)】現場演講內容整理而成。馬進 網易 DDB項目負責人來自網易杭研大數據平臺組,入職以來先后參與了分布式數據庫DDB,緩存NKV,網易數據運河NDC等項目&#xf…

element label動態賦值_淺析 vuerouter 源碼和動態路由權限分配

背景上月立過一個 flag,看完 vue-router 的源碼,可到后面逐漸發現 vue-router 的源碼并不是像很多總結的文章那么容易理解,閱讀過你就會發現里面的很多地方都會有多層的函數調用關系,還有大量的 this 指向問題,而且會有…

MessagePack Java 0.6.X List, Map 對象的序列化和反序列化

為了序列化原生的容器對象例如 List 和 Map 對象,你必須使用 Template。 Template 對象是 serializer 和 deserializer 的配對。例如,為了序列化一個 List 對象,在 List 對象中 Integer 對象為元素,你可以使用下面的方法來創建一…

世界領先的界面設計公司:The Skins Factory

該公司的網站: http://www.theskinsfactory.com/skinsfactory/ 該公司誕生于2000年,由一群狂熱的界面愛好者,帶著對GUI的熱情和大膽的洞察力創立。很快,皮膚工廠便成長為世界領先的、真正的、革命性界面解決方案提供商。 更多的精…

HDU 1253 勝利大逃亡 題解

勝利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 44540 Accepted Submission(s): 15483 Problem DescriptionIgnatius被魔王抓走了,有一天魔王出差去了,這可是Ignatius逃亡的好機會.魔王住在一個城堡…

lstm需要優化的參數_使用PyTorch手寫代碼從頭構建LSTM,更深入的理解其工作原理...

這是一個造輪子的過程,但是從頭構建LSTM能夠使我們對體系結構進行更加了解,并將我們的研究帶入下一個層次。LSTM單元是遞歸神經網絡深度學習研究領域中最有趣的結構之一:它不僅使模型能夠從長序列中學習,而且還為長、短期記憶創建…

有哪些漂亮的中國風 LOGO 設計?

提到中國風的logo,我覺得首先登場的應該是北京故宮博物院的logo,鐺!故宮博物院的logo,從顏色,到外形,到元素,無一例外,充滿了中國風的味道,可謂是中國風中的典型。同一風…