エッジ検出(複数パターン)
基本的にエッジ検出(単体パターン)処理ですが、パターンを複数適用しています。
これにより、より鮮明に輪郭部分を検出することができるらしい。
検出された輪郭を分かりやすくする為に、事前にグレースケール処理を行ってから処理しています。
private Bitmap edgeDetectionPatternMultiple( 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[][] patternX; int[][] patternY; // Prewitt int[][] patternX1 = { { -1, -1, -1 }, { 0, 0, 0 }, { 1, 1, 1 } }; int[][] patternY1 = { { -1, 0, 1 }, { -1, 0, 1 }, { -1, 0, 1 } }; // Sobel int[][] patternX2 = { { -1, -2, -1 }, { 0, 0, 0 }, { 1, 2, 1 } }; int[][] patternY2 = { { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } }; // Roberts int[][] patternX3 = { { 0, 0, 0 }, { 0, 1, 0 }, { 0, 0, -1 } }; int[][] patternY3 = { { 0, 0, 0 }, { 0, 0, 1 }, { 0, -1, 0 } }; switch( patternFlg ){ case 2 : patternX = patternX2; patternY = patternY2; break; case 3 : patternX = patternX3; patternY = patternY3; break; default : patternX = patternX1; patternY = patternY1; break; } for( int YY = 0; YY < width; ++YY ){ for( int XX = 0; XX < height; ++XX ){ int rrX = 0; int ggX = 0; int bbX = 0; int rrY = 0; int ggY = 0; int bbY = 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 )]; rrX += Color.red( bitmapColor ) * patternX[( Y + 1 )][( X + 1 )]; ggX += Color.green( bitmapColor ) * patternX[( Y + 1 )][( X + 1 )]; bbX += Color.blue( bitmapColor ) * patternX[( Y + 1 )][( X + 1 )]; rrY += Color.red( bitmapColor ) * patternY[( Y + 1 )][( X + 1 )]; ggY += Color.green( bitmapColor ) * patternY[( Y + 1 )][( X + 1 )]; bbY += Color.blue( bitmapColor ) * patternY[( Y + 1 )][( X + 1 )]; } } int rr = (int)Math.sqrt( rrX * rrX + rrY * rrY ); int gg = (int)Math.sqrt( ggX * ggX + ggY * ggY ); int bb = (int)Math.sqrt( bbX * bbX + bbY * bbY ); 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)(違いは詳細で見てください):