Marr-Hildreth邊緣檢測器
介紹
20世紀70年代末,David Marr 嘗試將生物視覺融合進一個可以用於機器視覺的模型。Marr描述道“早期視覺處理的目標是對影象構建一個原始但豐富的描述,用於確定可視表面的反射系統和光強度,以及它們相對於觀察者的方向的距離”[1]。他把最低階別的描述稱為原始要素圖,其中最主要的組成部分是邊緣。
基本理論
根據[1]中,我們可以將一個邊緣檢測演算法描述為:
- 1) 通過一個二維高斯函式對影象I進行卷積運算;
- 2) 計算卷積影象的Lapace運算元,稱為 L ;
- 3)尋找邊緣畫素:在L中存在零交叉的畫素。通過高斯函式計算出來的卷積具有多種不同的標準偏差,而這些標準偏差可以結合為一個單獨的邊緣影象。
我們可以通過差分進行計算,面這個例子中順序並沒有關係,因些可以通過分析法計算高斯拉普拉斯運算元(Laplacian of the Gaussina,LoG),並且取樣這個函式。建立一個卷積掩模;可以對影象應用這個卷積掩模產生同樣的結果。在此,給出相應的程式碼:
float LoG (float x, float sigma){
float x1;
x1 = gauss (x, sigma);
return (x*x-2*sigma*sigma)/(sigma*sigma*sigma*sigma) * x1;
}
在此需要識別出零交叉,標記出在這些位置處的畫素(設P),P處零交叉意味著某個方向兩個相對的相鄰畫素的值的符號不同。我們通過zero_cross函式LoG中的每一畫素進行執行。void zero_cross (float **lapim, IMAGE im)
為了確保使用了多種不同的尺度,使用了兩個不同的高斯函式,並且將兩種尺度下具有零交叉的畫素選擇出來作為輸出邊緣畫素。當然,還可以使用兩個以上的高斯函式。在此貼出Marri演算法程式碼。
Marri演算法程式碼
void marr (float s, IMAGE im){
int width;
float **smx;
int i,j,k,n;
float **lgau, z;
//Create a Gaussian and a derivative of Gaussian filter mask
width = 3.35*s + 0.33;
n = width+width + 1;
printf ("Smoothing with a Gaussian of size %dx%d\n", n, n);
lgau = f2d (n, n);
for (i=0; i<n; i++)
for (j=0; j<n; j++)
lgau[i][j] = LoG (distance ((float)i, (float)j,(float)width, (float)width), s);
//Convolution of source image with a Gaussian in X and Y directions
smx = f2d (im->info->nr, im->info->nc);
printf ("Convolution with LoG:\n");
convolution (im, lgau, n, n, smx, im->info->nr, im->info->nc);
// Locate the zero crossings
printf ("Zero crossings:\n");
zero_cross (smx, im);
// Clear the boundary
for (i=0; i<im->info->nr; i++){
for (j=0; j<=width; j++) im->data[i][j] = 0;
for (j=im->info->nc-width-1; j<im->info->nc; j++)
im->data[i][j] = 0;
}
for (j=0; j<im->info->nc; j++){
for (i=0; i<= width; i++) im->data[i][j] = 0;
for (i=im->info->nr-width-1; i<im->info->nr; i++)
im->data[i][j] = 0;
}
free(smx[0]); free(smx);
free(lgau[0]); free(lgau);
}
測試結果分析
由於高斯濾波器的寬度原因,離影象邊緣小於一定值都沒有被處理,區域性性並不是特別好,而且邊緣並不總是很細。不論如何,Marri-Hildreth邊緣檢測器在低訊雜比的情況下要遠好於傳統的方法邊緣檢測。
參考文獻
[1] Theory of Edge Detection D. Marr; E. Hildreth, Proceedings of the Royal Society of London. Series B, Biological Sciences, Vol. 207, No. 1167. (Feb. 29, 1980), pp. 187-217.
關於Image Engineering & Computer Vision的更多討論與交流,敬請關注本博和新浪微博songzi_tea.
相關文章
- 影像邊緣檢測
- 影像的邊緣檢測
- 3.Canny邊緣檢測
- CV總結之邊緣檢測
- opencv學習之邊緣檢測OpenCV
- [機器視覺]halcon應用例項 邊緣檢測視覺
- python+opencv邊緣檢測方法整理PythonOpenCV
- 使用 Vyper 實現影像邊緣檢測
- 使用 Vala 實現影像邊緣檢測
- 使用 Fantom 實現影像邊緣檢測
- opencv——自適應閾值Canny邊緣檢測OpenCV
- 卷積神經網路1-邊緣檢測卷積神經網路
- 詳解數字影像的濾波和邊緣檢測
- Qt5&OpenCV3.2 Canny邊緣檢測+Hough變換QTOpenCV
- 輪廓檢測論文解讀 | 整體巢狀邊緣檢測HED | CVPR | 2015巢狀
- php 實現一個簡單的圖片邊緣檢測PHP
- Opencv-Python學習筆記十——影像梯度、邊緣檢測 Gradient, Edge DetectionOpenCVPython筆記梯度
- 邊緣計算2.0時代,“雲邊緣”與“邊緣雲”你分清了嗎?
- 【OpenCV3經典程式設計100例】(10)邊緣檢測:用Sobel()函OpenCV程式設計
- 秒懂邊緣雲 | 邊緣雲技術進階
- 【從0到1學習邊緣容器系列1】之 邊緣計算與邊緣容器的起源
- 神經網路之卷積篇:詳解更多邊緣檢測內容(More edge detection)神經網路卷積
- 天翼雲邊緣函式、邊緣安全專案入選“可信邊緣計算推進計劃”函式
- 高通濾波法、微分運算元法、神經網路方法實現邊緣檢測神經網路
- Python 影像處理 OpenCV (13): Scharr 運算元和 LOG 運算元邊緣檢測技術PythonOpenCV
- 邊緣應用場景需求興起,FusionCube解碼智慧邊緣!
- 使用邊緣計算閘道器分析CAN報文
- 邊緣計算|Hadoop——邊緣計算和Hadoop是什麼關係?Hadoop
- 雲原生與邊緣計算的碰撞——邊緣原生應用實踐
- 從中心走向邊緣——深度解析雲原生邊緣計算落地痛點
- AI影片邊緣分析盒AI
- 一維卡尺邊緣對
- 3. OpenCV-Python——影像梯度演算法、邊緣檢測、影像金字塔與輪廓檢測、直方圖與傅立葉變換OpenCVPython梯度演算法直方圖
- 浪潮邊緣伺服器支援中國聯通首批5G白盒UPF測試伺服器
- 基於邊緣計算閘道器的校園環境和能耗監測系統
- 邊緣計算系列科普(五)邊緣計算中的關鍵技術
- 【從0到1學習邊緣容器系列2】之 邊緣應用管理
- 天翼雲Web應用防火牆(邊緣雲版)支援檢測和攔截Apache Spark shell命令注入漏洞Web防火牆ApacheSpark
- 邊框檢測在 Python 中的應用Python