基於OpenCV和深度學習的整體巢狀邊緣檢測
整體巢狀邊緣檢測 (HED) 是一種基於深度學習的影像邊緣檢測方法,可以使用深度學習和 Python 庫 OpenCV 來實現。整體巢狀邊緣檢測由 Xie 和 Tu 於 2015 年首次提出,此後被廣泛應用於計算機視覺領域。近年來,由於其能夠在影像中生成準確且高質量的邊緣圖,因此獲得了廣泛的關注。
本文將討論 HED 的基礎知識、其工作原理以及如何使用 OpenCV 和深度學習(以及 Canny)來實現它。
什麼是 HED(整體巢狀邊緣檢測)?
在計算機視覺中,邊緣檢測是一項重要的任務,它涉及識別和定點陣圖像中的急劇不連續性。這些影像中的不連續性通常用作更復雜計算機視覺過程(如物件分割和物件檢測)的基礎。
傳統的邊緣檢測方法使用手工設計的影像特徵和啟發式方法來識別影像邊緣。這些方法通常受到其無法處理複雜結構的邊緣或影像紋理或光照變化的限制。
整體巢狀邊緣檢測是一種基於深度學習的影像邊緣檢測方法,它透過直接從影像資料中學習邊緣特徵來克服傳統邊緣檢測方法的侷限性。它使用深度卷積神經網路 (CNN) 建立一組層次邊緣圖,其中每個圖表示不同尺度的邊緣。
使用 OpenCV 和深度學習執行整體巢狀邊緣檢測的步驟
按照以下步驟使用 OpenCV 和深度學習執行整體巢狀邊緣檢測:
匯入必要的庫。我們匯入 cv2 用於影像處理,匯入 numpy 用於數值運算。
使用 cv2.dnn.readNetFromCaffe() 載入預訓練的邊緣檢測模型。我們需要提供兩個檔案的路徑:deploy.prototxt 和 hed_pretrained_bsds.caffemodel。這些檔案分別包含模型的架構和權重。
使用 cv2.imread() 載入輸入影像,並將其調整為 512 x 512 畫素的較小尺寸。將影像調整為較小尺寸是可選的,但它可以幫助加快邊緣檢測過程。
然後,我們載入輸入影像並將其調整為最大 1000 畫素以加快處理速度。我們使用 cv2.cvtColor() 將調整大小的影像轉換為灰度影像。
我們還向函式提供一些其他引數,例如比例因子、影像大小、平均值等。這些值特定於我們正在使用的預訓練模型。
使用 cv2.Canny() 對灰度影像應用 Canny 邊緣檢測。這有助於檢測影像中的強邊緣。
我們使用預訓練模型執行整體巢狀邊緣檢測。我們首先使用 model.setInput() 設定模型的輸入。我們將灰度影像的 blob 作為輸入傳遞。
我們使用 cv2.threshold() 對輸出影像進行閾值處理以獲得二值邊緣。我們使用 Otsu 閾值方法,該方法會自動計算最佳閾值。
最後,我們使用 model.forward() 獲取模型的輸出。
使用 cv2.imshow() 顯示輸入影像、Canny 邊緣和 HED 邊緣,並在使用者按下鍵關閉視窗之前等待,使用 cv2.waitKey() 和 cv2.destroyAllWindows()。
示例
import cv2 import numpy as np # Load the pre-trained HED model hed_model = cv2.dnn.readNetFromCaffe("deploy.prototxt", "hed_pretrained_bsds.caffemodel") # Load the input image image = cv2.imread("sample2.jpg") # Resize the image for faster processing height, width = image.shape[:2] max_size = max(height, width) scale = 1.0 if max_size > 1000: scale = 1000.0 / max_size resized = cv2.resize(image, None, fx=scale, fy=scale) # Convert the image to grayscale gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY) # Apply Canny edge detection to the grayscale image canny = cv2.Canny(gray, 100, 200) # Apply HED to the color image hed_model.setInput(cv2.dnn.blobFromImage(resized, scalefactor=1.0, size=(width, height), mean=(104.00698793, 116.66876762, 122.67891434), swapRB=False, crop=False)) hed = hed_model.forward() hed = np.squeeze(hed) # Convert the HED output to a binary image hed = np.squeeze(hed) hed = np.uint8(hed * 255) hed_edges = cv2.convertScaleAbs(hed) ret, hed_edges = cv2.threshold(hed_edges, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # Threshold the output image to obtain binary edges ret, hed_edges = cv2.threshold(hed, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # Display the input and output images cv2.imshow("Input", resized) cv2.imshow("Canny", canny) cv2.imshow("HED", hed_edges) cv2.waitKey(0) cv2.destroyAllWindows()
輸出
結論
總之,整體巢狀邊緣檢測 (HED) 是一種強大的影像邊緣檢測技術,可提供高質量的結果和高精度。它基於深度學習演算法,可以學習和適應不同的影像變化和結構,這使其適用於影像處理和計算機視覺領域的各種應用。我們瞭解到 OpenCV 為整體巢狀邊緣檢測提供了一個便捷的框架,並且是執行邊緣檢測的有效方法之一。