我正在尝试使用图像j实现中值过滤。 我在使用零填充时遇到问题,因为它会在图片的底部和最左侧添加额外的零。
这是我到目前为止所做的,如果你们能帮助我的话:
Dialog.create("9x9 median filtering");
Dialog.addMessage("9x9 median filtering");
Dialog.show();
setBatchMode(true);
median_filter_9();
setBatchMode("exit and display");
// Produce the 9x9 median image
function median_filter_9()
{
width = getWidth();
height= getHeight();
//if you want to apply this median filter to 16bit
depth = bitDepth();
nBin= pow(2, depth);
//nBin hold max gray intensity value
filteHisto = newArray(nBin);
//filteHisto = newArray(255);
fiveBYFive = newArray(81);
//this is what i used for middle position of array to get median
middlePos = round(81/2);
//-3, -3 will get you position 0,0 of a 9x9 matrix if you start in the middle
for(j=-2;j<width-2;j++){
for(i=-2;i<height-2;i++){
z=0;
for(r=0;r<9;r++){
for(c=0;c<9;c++){
//Extend outside image boundaries using zero padding.
//error here: adds extra to bottom and farleft of picture
if(j+r<0||j+r>=width||i+c<0||i+c>=height){
fiveBYFive[z]=0;
z++;
}else{
v = getPixel(j+r,i+c);
fiveBYFive[z]= v;
z++;
}
}
}
//sort the array to find median
Array.sort(fiveBYFive);
median = fiveBYFive[middlePos];
setPixel(j, i, median);
}
updateDisplay();
}
}
答案 0 :(得分:0)
您在图像边缘看到的一个问题是因为您正在用零填充9x9窗口,但仍然将中间值作为81项窗口的中间位置。
因此,例如,在图像的第一列中,您将零填充至少36个元素(更多位于顶部和底部),这意味着您只需要在图像中找到4或5个零像素使中位数为零。
最简单的解决方法是根据您添加的零点数向上调整中位元素的索引(在每次迭代时初始化为81/2),或者只计算您使用的非零像素数,然后找到中位数 - 在排序数组中通过该范围的方式(考虑排序顺序)。
通过这种方式,您可以获取找到的实际像素的中值,并忽略填充的零。
可能您错过了将代码从原来的5x5更改为9x9,因为开始/结束索引在任何情况下都是错误的,应该是
for(j=-4;j<width;j++){
for(i=-4;i<height;i++){
其他可能的混淆来源是这条线,看起来你已经混淆了宽度和高度
if(j+r<0||j+r>=width||i+c<0||i+c>=height)
如果j
是列索引而i
是行索引,那么它应该是
if(j+c<0||j+c>=width||i+r<0||i+r>=height)
虽然对于方形窗口,实际上这并没有任何区别。