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

どうでもいい記事100選

エッジ検出(単体パターン)

エッジ。。。輪郭を検出する処理です。検出方向によって検出結果が変わるらしい。ここでは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;
  }

オリジナル:
f:id:masugata:20110405125239:image:medium
エッジ検出(パターン1)(違いは詳細で見てください):
f:id:masugata:20110502113717:image:medium
エッジ検出(パターン2)(違いは詳細で見てください):
f:id:masugata:20110502113721:image:medium
エッジ検出(パターン3)(違いは詳細で見てください):
f:id:masugata:20110502113725:image:medium
エッジ検出(パターン4)(違いは詳細で見てください):
f:id:masugata:20110502113730:image:medium
エッジ検出(パターン5)(違いは詳細で見てください):
f:id:masugata:20110502113741:image:medium
エッジ検出(パターン6)(違いは詳細で見てください):
f:id:masugata:20110502113746:image:medium
エッジ検出(パターン7)(違いは詳細で見てください):
f:id:masugata:20110502113750:image:medium
エッジ検出(パターン8)(違いは詳細で見てください):
f:id:masugata:20110502113756:image:medium
エッジ検出(パターン9)(違いは詳細で見てください):
f:id:masugata:20110502113802:image:medium
エッジ検出(パターン10)(違いは詳細で見てください):
f:id:masugata:20110502113808:image:medium
エッジ検出(パターン11)(違いは詳細で見てください):
f:id:masugata:20110502113815:image:medium
エッジ検出(パターン12)(違いは詳細で見てください):
f:id:masugata:20110502113821:image:medium


ネタが少しだけ増えたので再開。。。すぐにネタ切れになりますけど。_| ̄|○