【问题标题】:Zero padding / median filtering零填充/中值滤波
【发布时间】:2013-05-30 06:29:41
【问题描述】:

我正在尝试使用图像 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();
 }



}

【问题讨论】:

  • 欢迎来到 Stack Overflow!要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)来隔离问题,方法是跟踪程序的进度,并将其与您期望发生的情况进行比较。一旦两者发生分歧,那么您就发现了您的问题。 (然后如果有必要,你应该构造一个minimal test-case。)
  • 我第二个@OliCharlesworth。如果您需要进一步的帮助,请告诉我们!
  • @OliCharlesworth 我已经完成了代码的编写,但我被困在零填充上,我们这里没有导师,所以我正在寻求帮助
  • 像其他同学一样自己完成 CS373 作业怎么样?
  • 我使用乒乓(镜像)填充,这意味着当你接近边缘时,你会得到边缘像素逐渐变大部分的双重表示,但没有人得到超过两个(角落除外)。我从来没有真正想过这有多公平,但这比重写我的内核来选择不同的索引要容易得多。

标签: image-processing filtering median


【解决方案1】:

您在图像边缘看到的一个问题是因为您可以用零填充 9x9 窗口,但您仍然将中间值作为 81 项目窗口的中间值。

因此,例如,在图像的第一列中,您对至少 36 个元素进行零填充(顶部和底部更多),这意味着您只需要在图像中再找到 4 或 5 个零像素使中值元素为零。

最简单的解决方法是根据您添加的零数向上调整中值元素的索引(在每次迭代中初始化为 81/2),或者只计算您使用了多少非零像素,然后找到中值 mid-通过排序数组中的该范围(考虑排序顺序)。

通过这种方式,您获取找到的实际像素的中值并忽略填充的零。

您可能错过了将代码从原来的 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)

虽然对于方形窗口,这在实践中实际上并没有任何区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多