ノイズ除去
縦横斜め前後の情報を取得。で、ソートした後に真ん中の値を採用。。。という事らしい。
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; }