最基本的Sobel Filter可以參考到Wiki的Sobel operator這篇。目前自己實作過的也只有Wiki的Formulation所提到的方式,在每個pixel convolution 水平和垂直的矩陣之後的Gx、Gy,最後平方相加再開根號完取得G就是值的變化程度。為什麼可以這樣,主要是因為Sobel Filter的矩陣可以看到所有Element相加一定是為0的,所以如果當前的pixel與周圍相鄰的八個pixel值如果相同的話,做完convolution取得值的變化程度一定是0。
實作程式可以看到真00無雙的這篇。要注意的地方是當矩陣做convolution時超出image的範圍時該怎麼做,通常是那邊的矩陣元素就不要乘了。
實作程式可以看到真00無雙的這篇。要注意的地方是當矩陣做convolution時超出image的範圍時該怎麼做,通常是那邊的矩陣元素就不要乘了。
這邊只是簡單的虛擬碼,沒考慮矩陣超出image的範圍。重點是要容易了解演算法的結構,簡單的邏輯判斷就不管了。
foreach(pixel)
{
float pixelValue[9]
{
leftup, up, rightup
left, current, right
leftdown, down, rightdown
};
float sumX = 0, sumY = 0;
for(i = 0; i < 9; i++)
{
sumX += pixelValue[i] * horizontalMatrix[i];
sumY += pixelValue[i] * vertical Matrix[i];
}
gradient = sqrt(sumX * sumX + sumY * sumY);
// threshold could be percent value for current pixel.
// and we suppose pixel value range is [0, 1], and follow wiki common
// sobel matrix, the threshold range must be [0, 4].
return (gradient > threshold * pixelValue[4]) ? edge : background;
}
沒有留言:
張貼留言