ます’s Blog - どうでもいい記事100選

どうでもいい記事100選

ノイズ除去

縦横斜め前後の情報を取得。で、ソートした後に真ん中の値を採用。。。という事らしい。

  private Bitmap effectMedianFilter( Bitmap bitmap ){

    if( bitmap == null ){
      bitmap = BitmapFactory.decodeResource( getResources( ), R.drawable.original ).copy( Bitmap.Config.ARGB_8888, true );
    }

    if( bitmap == null ){
      return bitmap;
    }

    if( bitmap.isMutable( ) != true ){
      bitmap = bitmap.copy( Bitmap.Config.ARGB_8888, true );
    }

    int height   = bitmap.getHeight( );
    int width    = bitmap.getWidth( );
    int[] pixels = new int[( width * height )];
    bitmap.getPixels( pixels, 0, width, 0, 0, width, height );

    int maxFiter   = 9;
    int fiterCount = 0;
    int[] filter   = new int[maxFiter];

    for( int YY = 0; YY < width; ++YY ){
      for( int XX = 0; XX < height; ++XX ){

        fiterCount = 0;
        for( int X = fiterCount = 0; X < maxFiter; ++X ){
          filter[X] = 2147483647;
        }

        for( int Y = -1; Y <= 1; ++Y ){
          for( int X = -1; X <= 1; ++X ){
            
            if( ( Y + YY ) < 0 || width  <= ( Y + YY ) ||
                ( X + XX ) < 0 || height <= ( X + XX ) ){
              continue;
            }
 
            filter[fiterCount] = pixels[( ( Y + YY ) + ( X + XX ) * width )];
            ++fiterCount;
          }
        }

        if( fiterCount > 0 ){
          Arrays.sort( filter );
          int bitmapColor = filter[( fiterCount / 2 )];

          int rr = Color.red( bitmapColor );
          int gg = Color.green( bitmapColor );
          int bb = Color.blue( bitmapColor );
          
          pixels[( YY + XX * width )] = Color.rgb( rr, gg, bb );
        }
      }
    }

    bitmap.setPixels( pixels, 0, width, 0, 0, width, height );

    return bitmap;
  }

オリジナル:
f:id:masugata:20110331151809:image:medium
ノイズ除去(違いは詳細で見てください):
f:id:masugata:20110331164803:image:medium