中值滤波
中值滤波也是消除图像噪声最常见的手段之一,特别是消除椒盐噪声,中值滤波的效果要比均值滤波更好。中值滤波是跟均值滤波唯一不同是,不是用均值来替换中心每个像素,而是将周围像素和中心像素排序以后,取中值,一个3X3大小的中值滤波如下:
//中值滤波
var
medianCounter;
function
median(
imgData,
size) {
if (!
medianCounter)
medianCounter =
0;
pixelData =
tmppixelData =
imgData.
data,
size =
size ||
3;
for (
var
i =
0;
i <
canvas.
height;
i++) {
for (
var
j =
0;
j <
canvas.
width;
j++) {
var
tempR = [],
tempG = [],
tempB = [];
for (
var
dx =
0;
dx <
size;
dx++) {
for (
var
dy =
0;
dy <
size;
dy++) {
var
x =
i +
dx;
var
y =
j +
dy;
var
p =
x *
canvas.
width +
y;
tempR.
push(
tmppixelData[
p *
4 +
0])
tempG.
push(
tmppixelData[
p *
4 +
1])
tempB.
push(
tmppixelData[
p *
4 +
2])
}
}
tempR.
sort();
tempG.
sort();
tempB.
sort();
var
index = ~~((
size *
size) /
2);
var
p =
i *
canvas.
width +
j;
pixelData[
p *
4 +
0] =
tempR[
index];
pixelData[
p *
4 +
1] =
tempG[
index];
pixelData[
p *
4 +
2] =
tempB[
index];
}
}
imgData.
data =
pixelData;
medianCounter++;
//迭代次数
if (
medianCounter ==
1) {
return
imgData;
}
else {
return
median(
imgData,
size)
}
}