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.
相關文章
- 影像邊緣檢測
- 影像的邊緣檢測
- 邊緣檢測演算法——Canny和LoG邊緣檢測演算法演算法
- 大津法——邊緣檢測
- 3.Canny邊緣檢測
- opencv學習之邊緣檢測OpenCV
- 影象特徵提取:Sobel邊緣檢測特徵
- [機器視覺]halcon應用例項 邊緣檢測視覺
- python+opencv邊緣檢測方法整理PythonOpenCV
- Laplacian(iOS)運算元(邊緣檢測)iOS
- opencv——自適應閾值Canny邊緣檢測OpenCV
- OPENCV例程2 :CANNY運算元邊緣檢測OpenCV
- 【OpenCV】影像的變換(三)-Canny邊緣檢測OpenCV
- 卷積神經網路1-邊緣檢測卷積神經網路
- OpenCV(iOS)的邊緣檢測和Canny運算元OpenCViOS
- Qt5&OpenCV3.2 Canny邊緣檢測+Hough變換QTOpenCV
- 詳解數字影像的濾波和邊緣檢測
- 影象邊緣檢測—sobel運算元(灰度影象,彩色影象)
- php 實現一個簡單的圖片邊緣檢測PHP
- 經典影象邊緣檢測(模板法思想)——Kirsch運算元
- 【2017年10月最新深度學習方面的邊緣檢測論文和程式碼】【CASENet:深度類別感知語義邊緣檢測】深度學習SENet
- opencv 邊緣羽化,邊緣過渡OpenCV
- 輪廓檢測論文解讀 | 整體巢狀邊緣檢測HED | CVPR | 2015巢狀
- 邊緣計算2.0時代,“雲邊緣”與“邊緣雲”你分清了嗎?
- 秒懂邊緣雲 | 邊緣雲技術進階
- 邊緣計算?
- 【OpenCV3經典程式設計100例】(10)邊緣檢測:用Sobel()函OpenCV程式設計
- Opencv-Python學習筆記十——影像梯度、邊緣檢測 Gradient, Edge DetectionOpenCVPython筆記梯度
- 【從0到1學習邊緣容器系列1】之 邊緣計算與邊緣容器的起源
- 天翼雲邊緣函式、邊緣安全專案入選“可信邊緣計算推進計劃”函式
- 高通濾波法、微分運算元法、神經網路方法實現邊緣檢測神經網路
- 神經網路之卷積篇:詳解更多邊緣檢測內容(More edge detection)神經網路卷積
- 邊緣應用場景需求興起,FusionCube解碼智慧邊緣!
- 浪潮邊緣伺服器支援中國聯通首批5G白盒UPF測試伺服器
- 雲原生與邊緣計算的碰撞——邊緣原生應用實踐
- 從中心走向邊緣——深度解析雲原生邊緣計算落地痛點
- 使用邊緣計算閘道器分析CAN報文
- Aruba的智慧邊緣時代