邊緣檢測運算元Marr Hildreth實現

2021-12-30 05:41:17 字數 1241 閱讀 1690

二階微分運算元典型的是laplace運算元,log可以看成是乙個高斯模板的拉普拉斯變換。

log最底層的原理是二階微分運算元,也就是對原始影象求二次微分的邊緣定位演算法,當使用二階微分運算元的時候,其對邊緣的響應是乙個零交叉,而且能夠判斷出高灰度方向,但二階微分對雜訊的敏感度過高,需要平滑預處理。由於雜訊點對邊緣有一定的影響,所以更好的邊緣檢測器是log運算元,它把高斯平滑濾波器和拉普拉斯銳化濾波器結合起來,先平滑掉雜訊,再進行邊緣檢測,所以效果會更好。

marr和hildreth證明了以下兩個觀點:

1.灰度變化與影象尺寸沒有關係,因此檢測需要不同尺度的運算元

2.灰度的突然變化會在一階導數中引起波峰和波谷,或者二階導數中一起零交叉

log運算元:2g

其中標準高斯函式,g(x,y)標準差δ:

g(x,y)=ex2+y22δ2

對乙個標準高斯函式(未歸一化)進行二次偏微分:

2g(x,y)=2g(x,y)x2+2g(x,y)y2=[x2+y22δ2δ4]ex2+y22δ2

log零交叉出現在x2+y2=2δ2處log函式形狀如下圖,也被叫做墨西哥草帽運算元。

**實現:

void marredge(cv::mat image, cv::mat &result, int kervalue, double delta)

} //輸出引數設定

int keroffset = kervalue / 2;

cv::mat laplacian = (cv::mat_(image.rows - 2 * keroffset, image.cols - keroffset * 2));

result = cv::mat::zeros(image.rows - 2 * keroffset, image.cols - 2 * keroffset, image.type());

double sumlaplacian;

for (int i = keroffset; i < image.rows - keroffset; i++)

}//生成拉普拉斯結果

laplacian.at(i - keroffset, j - keroffset) = sumlaplacian;

} }//過零點交叉,尋找邊緣畫素

for (int i = 1; i < result.rows - 1; i++) }

}執行結果:

邊緣檢測運算元

看了很多邊緣檢測的文章,有些不夠詳細,有些不算綜合,所以打算總結一下!以下內容均為個人理解,如有問題,望指正!首先,我想要解釋一下什麼是邊緣。通俗地講,灰度值變化劇烈的地方就是邊緣。那麼如何判斷灰度值變化?如何度量 劇烈 各類演算法給出了自己的規範或者說是原則。所以,各類運算元就跳出來了。由於各類運...

邊緣檢測運算元

sobel amp image edgeamplitude filtertype,size 根據影象的一次導數計算影象的邊緣 close edges edges,edgeimage regionresult minamplitude close edges length edges,gradient...

邊緣檢測運算元

1.sobel運算元 索貝爾 主要思想是 利用影象畫素點的上下左右的畫素點進行加權差,邊緣的差值會較大,從而得到對應的邊緣。它是一種差分性運算元,包含3 3的橫向,縱向模板,分別對影象進行卷積,得到橫座標,縱座標的亮度差分值。計算出影象亮度函式的梯度近似值。它是一種基於一階導數的邊緣運算元。優點是能...