エッジ検出(単体パターン)
エッジ。。。輪郭を検出する処理です。検出方向によって検出結果が変わるらしい。ここでは12パターンくらい用意して確認。
検出された輪郭を分かりやすくする為に、事前にグレースケール処理を行ってから処理しています。
private Bitmap edgeDetectionPattern( Bitmap bitmap, int patternFlg ){ 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[] pixelsCopy = pixels.clone( ); int[][] pattern; int[][] pattern01 = { { 0, -1, 0 }, { 0, 1, 0 }, { 0, 0, 0 } }; int[][] pattern02 = { { 0, -2, 0 }, { 0, 2, 0 }, { 0, 0, 0 } }; int[][] pattern03 = { { 0, 0, 0 }, { -1, 1, 0 }, { 0, 0, 0 } }; int[][] pattern04 = { { 0, 0, 0 }, { -2, 2, 0 }, { 0, 0, 0 } }; int[][] pattern05 = { { 0, -1, 0 }, { 0, 0, 0 }, { 0, 1, 0 } }; int[][] pattern06 = { { 0, 0, 0 }, { 1, 0, -1 }, { 0, 0, 0 } }; int[][] pattern07 = { { -1, -1, 0 }, { -1, 0, 1 }, { 0, 1, 1 } }; int[][] pattern08 = { { 0, -1, -1 }, { 1, 0, 1 }, { 1, 1, 0 } }; int[][] pattern09 = { { -1, 0, 1 }, { -1, 0, 1 }, { -1, 0, 1 } }; int[][] pattern10 = { { -1, -1, -1 }, { 0, 0, 0 }, { 1, 1, 1 } }; int[][] pattern11 = { { -1, -2, -1 }, { 0, 0, 0 }, { 1, 2, 1 } }; int[][] pattern12 = { { 1, 0, -1 }, { 2, 0, -2 }, { 1, 0, 1 } }; switch( patternFlg ){ case 2 : pattern = pattern02; break; case 3 : pattern = pattern03; break; case 4 : pattern = pattern04; break; case 5 : pattern = pattern05; break; case 6 : pattern = pattern06; break; case 7 : pattern = pattern07; break; case 8 : pattern = pattern08; break; case 9 : pattern = pattern09; break; case 10 : pattern = pattern10; break; case 11 : pattern = pattern11; break; case 12 : pattern = pattern12; break; default : pattern = pattern01; break; } for( int YY = 0; YY < width; ++YY ){ for( int XX = 0; XX < height; ++XX ){ int rr = 0; int gg = 0; int bb = 0; 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; } int bitmapColor = pixels[( ( Y + YY ) + ( X + XX ) * width )]; rr += Color.red( bitmapColor ) * pattern[( Y + 1 )][( X + 1 )]; gg += Color.green( bitmapColor ) * pattern[( Y + 1 )][( X + 1 )]; bb += Color.blue( bitmapColor ) * pattern[( Y + 1 )][( X + 1 )]; } } rr = Math.abs( rr ); gg = Math.abs( gg ); bb = Math.abs( bb ); if( rr > 255 ){ rr = 255; } if( gg > 255 ){ gg = 255; } if( bb > 255 ){ bb = 255; } pixelsCopy[( YY + XX * width )] = Color.rgb( rr, gg, bb ); } } bitmap.setPixels( pixelsCopy, 0, width, 0, 0, width, height ); return bitmap; }
オリジナル:
エッジ検出(パターン1)(違いは詳細で見てください):
エッジ検出(パターン2)(違いは詳細で見てください):
エッジ検出(パターン3)(違いは詳細で見てください):
エッジ検出(パターン4)(違いは詳細で見てください):
エッジ検出(パターン5)(違いは詳細で見てください):
エッジ検出(パターン6)(違いは詳細で見てください):
エッジ検出(パターン7)(違いは詳細で見てください):
エッジ検出(パターン8)(違いは詳細で見てください):
エッジ検出(パターン9)(違いは詳細で見てください):
エッジ検出(パターン10)(違いは詳細で見てください):
エッジ検出(パターン11)(違いは詳細で見てください):
エッジ検出(パターン12)(違いは詳細で見てください):
ネタが少しだけ増えたので再開。。。すぐにネタ切れになりますけど。_| ̄|○