最基本的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; }
沒有留言:
張貼留言