我正試圖在JavaScript中實現一個簡單的雙邊過濾器。這是我到目前爲止:雙邊濾波算法
// For each pixel
for (var y = kernelSize; y < height-kernelSize; y++) {
for (var x = kernelSize; x < width-kernelSize; x++) {
var pixel = (y*width + x)*4;
var sumWeight = 0;
outputData[pixel] = 0;
outputData[pixel+1] = 0;
outputData[pixel+2] = 0;
outputData[pixel+3] = inputData[pixel+3];
// For each neighbouring pixel
for(var i=-kernelSize; i<=kernelSize; i++) {
for(var j=-kernelSize; j<=kernelSize; j++) {
var kernel = ((y+i)*width+x+j)*4;
var dist = Math.sqrt(i*i+j*j);
var colourDist = Math.sqrt((inputData[kernel]-inputData[pixel])*(inputData[kernel]-inputData[pixel])+
(inputData[kernel+1]-inputData[pixel+1])*(inputData[kernel+1]-inputData[pixel+1])+
(inputData[kernel+2]-inputData[pixel+2])*(inputData[kernel+2]-inputData[pixel+2]));
var curWeight = 1/(Math.exp(dist*dist/72)*Math.exp(colourDist*colourDist*8));
sumWeight += curWeight;
outputData[pixel] += curWeight*inputData[pixel];
outputData[pixel+1] += curWeight*inputData[pixel+1];
outputData[pixel+2] += curWeight*inputData[pixel+2];
}
}
outputData[pixel] /= sumWeight;
outputData[pixel+1] /= sumWeight;
outputData[pixel+2] /= sumWeight;
}
}
inputData來自html5畫布對象,格式爲rgba。 我的圖片或者想出任何更改或黑色斑塊周圍邊緣取決於我如何改變這種公式:
var curWeight = 1/(Math.exp(dist*dist/72)*Math.exp(colourDist*colourDist*8));
不幸的是我還是新來的HTML/JavaScript和圖像視覺算法和我的搜索有拿出沒有答案。我的猜測是,計算curWeight的方式有些問題。我在這裏做錯了什麼?我應該先將輸入圖像轉換爲CIElab/hsv嗎?
這是一個大量記錄的雙邊過濾器matlab代碼,我寫了,它適用於rgba圖像(包括邊緣)。 http://pastebin.com/pLu4v1dC這只是前面的參考資料,稍後會查看你的代碼 –