衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是邊緣檢測?邊緣檢測的算法由來

新機器視覺 ? 來源:AI公園 ? 作者:ANKIT SACHAN ? 2021-03-12 10:00 ? 次閱讀

導讀

分析了Canny的優劣,并給出了OpenCV使用深度學習做邊緣檢測的流程,文末有代碼鏈接。

在這篇文章中,我們將學習如何在OpenCV中使用基于深度學習的邊緣檢測,它比目前流行的canny邊緣檢測器更精確。邊緣檢測在許多用例中是有用的,如視覺顯著性檢測,目標檢測,跟蹤和運動分析,結構從運動,3D重建,自動駕駛,圖像到文本分析等等。

什么是邊緣檢測?

邊緣檢測是計算機視覺中一個非常古老的問題,它涉及到檢測圖像中的邊緣來確定目標的邊界,從而分離感興趣的目標。最流行的邊緣檢測技術之一是Canny邊緣檢測,它已經成為大多數計算機視覺研究人員和實踐者的首選方法。讓我們快速看一下Canny邊緣檢測。

Canny邊緣檢測算法

1983年,John Canny在麻省理工學院發明了Canny邊緣檢測。它將邊緣檢測視為一個信號處理問題。其核心思想是,如果你觀察圖像中每個像素的強度變化,它在邊緣的時候非常高。

在下面這張簡單的圖片中,強度變化只發生在邊界上。所以,你可以很容易地通過觀察像素強度的變化來識別邊緣。

現在,看下這張圖片。強度不是恒定的,但強度的變化率在邊緣處最高。(微積分復習:變化率可以用一階導數(梯度)來計算。)

Canny邊緣檢測器通過4步來識別邊緣:

去噪:因為這種方法依賴于強度的突然變化,如果圖像有很多隨機噪聲,那么會將噪聲作為邊緣。所以,使用5×5的高斯濾波器平滑你的圖像是一個非常好的主意。

梯度計算:下一步,我們計算圖像中每個像素的強度的梯度(強度變化率)。我們也計算梯度的方向。

梯度方向垂直于邊緣,它被映射到四個方向中的一個(水平、垂直和兩個對角線方向)。

非極大值抑制:現在,我們想刪除不是邊緣的像素(設置它們的值為0)。你可能會說,我們可以簡單地選取梯度值最高的像素,這些就是我們的邊。然而,在真實的圖像中,梯度不是簡單地在只一個像素處達到峰值,而是在臨近邊緣的像素處都非常高。因此我們在梯度方向上取3×3附近的局部最大值。

遲滯閾值化:在下一步中,我們需要決定一個梯度的閾值,低于這個閾值所有的像素都將被抑制(設置為0)。而Canny邊緣檢測器則采用遲滯閾值法。遲滯閾值法是一種非常簡單而有效的方法。我們使用兩個閾值來代替只用一個閾值:

高閾值 = 選擇一個非常高的值,這樣任何梯度值高于這個值的像素都肯定是一個邊緣。

低閾值 = 選擇一個非常低的值,任何梯度值低于該值的像素絕對不是邊緣。

在這兩個閾值之間有梯度的像素會被檢查,如果它們和邊緣相連,就會留下,否則就會去掉。

遲滯閾值化

Canny 邊緣檢測的問題:

由于Canny邊緣檢測器只關注局部變化,沒有語義(理解圖像的內容)理解,精度有限(很多時候是這樣)。

Canny邊緣檢測器在這種情況下會失敗,因為沒有理解圖像的上下文

語義理解對于邊緣檢測是至關重要的,這就是為什么使用機器學習或深度學習的基于學習的檢測器比canny邊緣檢測器產生更好的結果。

OpenCV中基于深度學習的邊緣檢測

OpenCV在其全新的DNN模塊中集成了基于深度學習的邊緣檢測技術。你需要OpenCV 3.4.3或更高版本。這種技術被稱為整體嵌套邊緣檢測或HED,是一種基于學習的端到端邊緣檢測系統,使用修剪過的類似vgg的卷積神經網絡進行圖像到圖像的預測任務。

HED利用了中間層的輸出。之前的層的輸出稱為side output,將所有5個卷積層的輸出進行融合,生成最終的預測。由于在每一層生成的特征圖大小不同,它可以有效地以不同的尺度查看圖像。

網絡結構:整體嵌套邊緣檢測

HED方法不僅比其他基于深度學習的方法更準確,而且速度也比其他方法快得多。這就是為什么OpenCV決定將其集成到新的DNN模塊中。以下是這篇論文的結果:

在OpenCV中訓練深度學習邊緣檢測的代碼

OpenCV使用的預訓練模型已經在Caffe框架中訓練過了,可以這樣加載:

sh download_pretrained.sh

網絡中有一個crop層,默認是沒有實現的,所以我們需要自己實現一下。

class CropLayer(object):

def __init__(self, params, blobs):

self.xstart = 0

self.xend = 0

self.ystart = 0

self.yend = 0

# Our layer receives two inputs. We need to crop the first input blob

# to match a shape of the second one (keeping batch size and number of channels)

def getMemoryShapes(self, inputs):

inputShape, targetShape = inputs[0], inputs[1]

batchSize, numChannels = inputShape[0], inputShape[1]

height, width = targetShape[2], targetShape[3]

self.ystart = (inputShape[2] - targetShape[2]) // 2

self.xstart = (inputShape[3] - targetShape[3]) // 2

self.yend = self.ystart + height

self.xend = self.xstart + width

return [[batchSize, numChannels, height, width]]

def forward(self, inputs):

return [inputs[0][:,:,self.ystart:self.yend,self.xstart:self.xend]]

現在,我們可以重載這個類,只需用一行代碼注冊該層。

cv.dnn_registerLayer(‘Crop’, CropLayer)

現在,我們準備構建網絡圖并加載權重,這可以通過OpenCV的dnn.readNe函數。

net = cv.dnn.readNet(args.prototxt, args.caffemodel)

現在,下一步是批量加載圖像,并通過網絡運行它們。為此,我們使用cv2.dnn.blobFromImage方法。該方法從輸入圖像中創建四維blob。

blob = cv.dnn.blobFromImage(image, scalefactor, size, mean, swapRB, crop)

其中:

image:是我們想要發送給神經網絡進行推理的輸入圖像。

scalefactor:圖像縮放常數,很多時候我們需要把uint8的圖像除以255,這樣所有的像素都在0到1之間。默認值是1.0,不縮放。

size:輸出圖像的空間大小。它將等于后續神經網絡作為blobFromImage輸出所需的輸入大小。

swapRB:布爾值,表示我們是否想在3通道圖像中交換第一個和最后一個通道。OpenCV默認圖像為BGR格式,但如果我們想將此順序轉換為RGB,我們可以將此標志設置為True,這也是默認值。

mean:為了進行歸一化,有時我們計算訓練數據集上的平均像素值,并在訓練過程中從每幅圖像中減去它。如果我們在訓練中做均值減法,那么我們必須在推理中應用它。這個平均值是一個對應于R, G, B通道的元組。例如Imagenet數據集的均值是R=103.93, G=116.77, B=123.68。如果我們使用swapRB=False,那么這個順序將是(B, G, R)。

crop:布爾標志,表示我們是否想居中裁剪圖像。如果設置為True,則從中心裁剪輸入圖像時,較小的尺寸等于相應的尺寸,而其他尺寸等于或大于該尺寸。然而,如果我們將其設置為False,它將保留長寬比,只是將其調整為固定尺寸大小。

在我們這個場景下:

inp = cv.dnn.blobFromImage(frame, scalefactor=1.0, size=(args.width, args.height),

mean=(104.00698793, 116.66876762, 122.67891434), swapRB=False,

crop=False)

現在,我們只需要調用一下前向方法。

net.setInput(inp)

out = net.forward()

out = out[0, 0]

out = cv.resize(out, (frame.shape[1], frame.shape[0]))

out = 255 * out

out = out.astype(np.uint8)

out=cv.cvtColor(out,cv.COLOR_GRAY2BGR)

con=np.concatenate((frame,out),axis=1)

cv.imshow(kWinName,con)

結果:

中間的圖像是人工標注的圖像,右邊是HED的結果

中間的圖像是人工標注的圖像,右邊是HED的結果

文中的代碼:

https://github.com/sankit1/cv-tricks.com/tree/master/OpenCV/Edge_detection

英文原文:https://cv-tricks.com/opencv-dnn/edge-detection-hed/
編輯:lyn

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 邊緣檢測
    +關注

    關注

    0

    文章

    92

    瀏覽量

    18249
  • 計算機視覺
    +關注

    關注

    8

    文章

    1700

    瀏覽量

    46131
  • 深度學習
    +關注

    關注

    73

    文章

    5516

    瀏覽量

    121556

原文標題:在OpenCV中基于深度學習的邊緣檢測

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AI模型部署邊緣設備的奇妙之旅:目標檢測模型

    并非易事,它涉及到從選擇合適的算法架構到針對特定硬件平臺進行優化等一系列復雜的工作。 接下來,我們將詳細介紹如何在資源受限的邊緣設備上成功部署目標檢測模型,探索其背后的原理和技術,并討論解決該領域內常見
    發表于 12-19 14:33

    AI模型部署邊緣設備的奇妙之旅:如何在邊緣端部署OpenCV

    圖像的質量,使得圖像更適合人類觀察或者為后續的分析做準備。 方法:通常涉及像素級別的操作,比如調整亮度、對比度、顏色校正、濾波(如高斯模糊、中值濾波去噪)、邊緣檢測、形態學變換(膨脹、腐蝕)等。 計算機視覺
    發表于 12-14 09:31

    安森美高性能產品賦能邊緣智能應用

    在數字化時代,海量數據的產生已經成為常態,從智能手機到物聯網設備,數據源已經無處不在。傳統的云計算模式雖然強大,但也存在著延遲、帶寬和數據隱私等問題。邊緣智能利用分布式計算,將AI算法和數據處理推向數據源附近的邊緣設備,以實現低
    的頭像 發表于 11-15 10:23 ?361次閱讀
    安森美高性能產品賦能<b class='flag-5'>邊緣</b>智能應用

    邊緣計算與邊緣設備的關系

    邊緣計算與邊緣設備之間存在著密切的關系,它們是相互依存、相互促進的。以下是對這兩者關系的介紹: 一、定義與功能 邊緣計算 邊緣計算是一種分布式計算概念,它將智能集成到
    的頭像 發表于 10-24 14:33 ?446次閱讀

    利用VLIB在TMS320C64x/64x+上實現Canny邊緣檢測

    電子發燒友網站提供《利用VLIB在TMS320C64x/64x+上實現Canny邊緣檢測.pdf》資料免費下載
    發表于 10-14 11:13 ?0次下載
    利用VLIB在TMS320C64x/64x+上實現Canny<b class='flag-5'>邊緣</b><b class='flag-5'>檢測</b>

    基于 DSP5509 進行數字圖像處理中 Sobel 算子邊緣檢測的硬件連接電路圖

    )將圖像數據傳輸到 DSP5509。 DSP5509 處理器:作為核心處理單元,負責接收圖像數據、執行 Sobel 算子邊緣檢測算法,并輸出處理后的結果。 存儲模塊:包括 RAM 和 Flash。RAM
    發表于 09-25 15:25

    使用邊緣AI和Sitara處理器進行關鍵字檢測

    電子發燒友網站提供《使用邊緣AI和Sitara處理器進行關鍵字檢測.pdf》資料免費下載
    發表于 09-02 11:30 ?0次下載
    使用<b class='flag-5'>邊緣</b>AI和Sitara處理器進行關鍵字<b class='flag-5'>檢測</b>

    DSP國產教學實驗箱_實驗案例_操作教程:5-11 邊緣檢測

    檢測算法是具有嚴格定義的、可以提供良好可靠檢測的方法之一。由于它具有滿足邊緣檢測的三個標準和實現過程簡單的優勢,成為邊緣
    發表于 07-19 10:38

    圖像邊緣檢測系統的設計流程

    圖像邊緣檢測系統的設計流程是一個涉及多個步驟的復雜過程,它旨在從圖像中提取出重要的結構信息,如邊界、輪廓等。這些邊緣信息對于圖像分析、機器視覺、圖像壓縮等領域至關重要。以下是一個詳細的圖像邊緣
    的頭像 發表于 07-17 16:39 ?419次閱讀

    圖像識別算法都有哪些方法

    傳統方法和基于深度學習的方法。 傳統圖像識別算法 1.1 邊緣檢測 邊緣檢測是圖像識別的基礎,它用于檢測
    的頭像 發表于 07-16 11:14 ?6067次閱讀

    opencv圖像識別有什么算法

    圖像識別算法邊緣檢測邊緣檢測是圖像識別中的基本步驟之一,用于識別圖像中的邊緣。常見的
    的頭像 發表于 07-16 10:40 ?1211次閱讀

    ai邊緣盒子有哪些用途?ai視頻分析邊緣計算盒子詳解

    近年來,隨著人工智能和邊緣計算的發展,一種名為AI邊緣盒子的新型設備正逐漸引起廣泛關注。作為一種集成了邊緣計算和AI算法處理能力的設備,AI邊緣
    的頭像 發表于 05-29 14:24 ?1075次閱讀
    ai<b class='flag-5'>邊緣</b>盒子有哪些用途?ai視頻分析<b class='flag-5'>邊緣</b>計算盒子詳解

    基于FPGA的實時邊緣檢測系統設計,Sobel圖像邊緣檢測,FPGA圖像處理

    摘要 :本文設計了一種 基于 FPGA 的實時邊緣檢測系統 ,使用OV5640 攝像頭模塊獲取實時的視頻圖像數據,提取圖像邊緣信息并通過 VGA顯示。FPGA 內部使用流水線設計和 并行運算加速
    發表于 05-24 07:45

    主流邊緣AI算法,在安防、零售、交通等領域的應用

    邊緣AI可以應用在哪些場景實現哪些功能。 ? 市面上主流的邊緣AI算法應用 ? 目前市面上比較主流的邊緣AI算法應用,包括人臉及關鍵點
    的頭像 發表于 05-13 01:56 ?3106次閱讀

    算法系列:基于 FPGA 的圖像邊緣檢測系統設計(sobel算法

    )為邊緣點。 用的是邊緣檢測算法。 難點: (1)掌握了 3*3 像素陣列,Gx 與 Gy 就很好計算了。 注意問題:為了避免計算過程中出現負值,所以將正負值分開單獨計算,具體見代碼
    發表于 03-26 16:40
    澳门百家乐官网免费开户| 百家乐正品| 百家乐官网使用技法| 最好的百家乐官网好评平台都有哪些 | 大发888 58| 九州百家乐官网娱乐城| 百家乐官网筹码14克| 试用的百家乐软件| 3u娱乐城| 利澳百家乐官网的玩法技巧和规则 | 缅甸百家乐官网赌城| 澳门百家乐玩法心得技巧| 大发888游戏登陆| 真人百家乐官网新开户送彩金| 香港百家乐官网赌城| 百家乐麻将筹码币镭射贴膜| 通州区| 网上百家乐如何打水| 大发888 casino组件下载| 百家乐官网最佳投注办法| 百家乐布| 豪门娱乐| 加州百家乐官网的玩法技巧和规则| 威尼斯人娱乐城会员| 百家乐官网真人投注网站| 泽普县| 澳门百家乐娱乐城打不开| 百家乐是否能赢| 三门峡市| 百家乐单注技巧| 太阳城娱乐城官方网站| 电玩百家乐官网的玩法技巧和规则 | 澳门百家乐介绍| 冕宁县| 百家乐玩法皇冠现金网| 鸿发娱乐| 网上百家乐合法吗| 同乐城娱乐城| 百家乐龙虎斗扎金花| 平凉市| 百家乐闲和庄|