2011-10-22 7 views
3

매우 낮은 해상도의 비트 맵에서 affine 변환을하고 싶습니다. 최대 정보량을 유지하면서 변환하고 싶습니다.보간법을 사용하는 Affine 변환

내 입력 데이터는 손으로 쓴 문자의 1 비트 64 x 64 픽셀 이미지이며 출력은 회색조와 높은 해상도입니다. 이미지를 분석 할 때 일련의 affine transformation (rotation, scaling, shear, translation)을 만들어서 하나의 affine transformation 행렬에 곱할 수 있습니다.

내 문제라는 입력 화상 주어진다 내 어떻게 가능한 최고 품질 내 출력 이미지를 계산할 수 아핀 변환 행렬을 계산? 저는 다른 보간 기법에 대한 기사를 읽었습니다. 그러나이 모두는 스케일링을위한 보간법에 관한 것이지 일반 아핀 변환에 관한 것이 아닙니다.

다음은 내가 찾고있는 것을 정확하게 보여주는 데모입니다. 아핀 변환 행렬 및 보간 기법이 주어지면 이미지를 계산합니다.

http://bigwww.epfl.ch/demo/jaffine/index.html

당신은 내가 더 낮은 해상도 1 비트 입력 주어진 T 아핀 변환 행렬이있는 경우 그레이 스케일 이미지 (예 : 4 배에 대한) 더 높은 해상도를 계산하기 위해 필요한 단계는 무엇인가 나를 설명 할 수 있습니까?

당신이 어떤 소스 코드에 저를 연결할 수 있습니다 또는 튜토리얼 또는 기사 가능 또는 책 선형을 구현하는 방법에 대한, 아핀과 입방 또는 더 나은 보간 변환?

Java에서이 문제를 구현해야하며 Java에 Affine 클래스가 있음을 알고 있지만 보간법을 구현하는지 여부는 알 수 없습니다. 보간법을 사용하여 아핀 변환을 수행하는 알고리즘을 작성하는 방법을 알아내는 데 코드를 읽는 것이 좋은 C++ 또는 Java 라이브러리를 알고 계십니까?

보간법을 사용하여 아핀 변환을 계산하기위한 내장 함수가있는 Java 또는 C++ 용 무료 라이브러리가 있습니까?

+3

자바에서 앤티 앨리어싱을 사용하여 java2d api로 affine 변환을 수행 할 수 있습니다. – Sibbo

+0

표준 비트 맵 이미지보다 훨씬 좋은 크기의 SVG 이미지를 사용해 보셨습니까? 아파치의 [Batik 라이브러리] (http://xmlgraphics.apache.org/batik/)는 자바와 함께 작동하며 이것을 믿을 수 있습니다. –

+0

@sibbo : Shapes를 돕지 만 비트 맵 이미지에는 도움이되지 않습니다. –

답변

0

좋아요, 제가 여기까지 나온 해결책이 있습니다.

  1. 제가

    static BufferedImage BImageFrom2DArray(float data[][]) { 
        int width = data.length; 
        int height = data[0].length; 
        BufferedImage myimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
        for (int x = 0; x < width; x++) { 
         for (int y = 0; y < height; y++) { 
          int value = (int) ((1f - data[x][y]) * 255f); 
          myimage.setRGB(y, x, (value << 16) | (value << 8) | value); 
         } 
        } 
        return myimage; 
    } 
    
  2. 보간 큐빅으로는, AffineTransformOp를 사용하여 아핀 변환을인가 BufferedImage의 객체로 내 배열 [] []는

    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BICUBIC); 
        BufferedImage im_transformed = op.filter(im_src, null); 
    
  3. 는 BufferedImage의 객체를 다시 형질 전환은 변환 된 배열 [] [] 안에 :

    static float[][] ArrayFromBImage(BufferedImage bimage, int width, int height) { 
        int max_x = bimage.getWidth(); 
        int max_y = bimage.getHeight(); 
        float[][] array = new float[width][height]; 
        for (int x = 0; x < width; x++) { 
         for (int y = 0; y < height; y++) { 
          float red, alpha, value; 
          int color; 
          if (x >= max_x || y >= max_y) { 
           array[y][x] = 0; 
          } else { 
           color = bimage.getRGB(x, y); 
           alpha = (color >> 24) & 0xFF; 
           red = (color >> 16) & 0xFF; 
           value = 1f - red/255; 
           if (alpha == 0) { 
            array[y][x] = 0; 
           } else { 
            array[y][x] = value; 
           } 
          } 
         } 
        } 
        return array; 
        } 
    
0

당신이 연결 한 사람들은 여러 보간 옵션이있는 C 구현을 가지고 있습니다. here. 아마도 JNI를 사용하여 포장 할 수 있습니다. OpenCV를 랩핑하는 JavaCV도 있습니다. OpenCV에는 보간법이있는 warpAffine이 있습니다. 또한 Java Advanced Imaging API here을 확인하십시오.

관련 문제