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

どうでもいい記事100選

エッジ検出(複数パターン)

基本的にエッジ検出(単体パターン)処理ですが、パターンを複数適用しています。
これにより、より鮮明に輪郭部分を検出することができるらしい。
検出された輪郭を分かりやすくする為に、事前にグレースケール処理を行ってから処理しています。

  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;
  }

オリジナル:
f:id:masugata:20110405125239:image:medium
エッジ検出(複数パターン1)(違いは詳細で見てください):
f:id:masugata:20110428203144:image:medium
エッジ検出(複数パターン2)(違いは詳細で見てください):
f:id:masugata:20110428203152:image:medium
エッジ検出(複数パターン3)(違いは詳細で見てください):
f:id:masugata:20110428203157:image:medium