0

画像 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();
 }



}
4

1 に答える 1

0

画像の端に見られる問題の 1 つは、9x9 ウィンドウをゼロでパディングしているためですが、81 項目ウィンドウの中央として中央値を取得しているためです。

したがって、たとえば、画像の最初の列では、少なくとも 36 個の要素 (上部と下部でさらに多く) をゼロ パディングします。中央要素ゼロ。

最も簡単な解決策は、追加したゼロの数に応じて中央値要素のインデックス (各反復で 81/2 に初期化) を上方に調整するか、使用したゼロ以外のピクセルの数を数えて、その途中で中央値を見つけることです。ソートされた配列の範囲(ソート順を考慮)。

このようにして、見つけた実際のピクセルの中央値を取得し、埋め込まれたゼロを無視します。

おそらく、コードを元の 5x5 から 9x9 に変更するのを忘れてしまったのでしょう。

   for(j=-4;j<width;j++){
     for(i=-4;i<height;i++){ 

後で混乱する可能性のあるもう1つの原因は、幅と高さを混同しているように見えるこの行です。

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)

ただし、正方形のウィンドウの場合、これは実際には何の違いもありません。

于 2013-06-04T04:56:53.707 に答える