2011-10-22 74 views
3

我想對極低分辨率的位圖進行仿射變換,我希望在保留最大量的信息的同時進行仿射變換。插值仿射變換

我的輸入數據是手寫字符的1位64×64像素圖像,我的輸出將是灰度和更高的分辨率。在對圖像進行分析後,我構建了一系列仿射變換(旋轉,縮放,剪切,平移),我可以將它們乘以一個仿射變換矩陣。

我的問題是,鑑於輸入圖像和我的計算仿射變換矩陣,我怎麼能計算出最高品質我的輸出圖像?我已經閱讀了關於不同插值技術的文章,但他們都是關於如何進行插值的縮放,而不是一般的仿射變換。

這是一個演示什麼是正在做什麼,我正在尋找。給定仿射變換矩陣和插值技術,它計算一幅圖像。

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

你能解釋我什麼是計算更高的分辨率(例如4倍)灰度圖像所需的步驟,如果我有一個較低的分辨率1位輸入和一個給定T仿射變換矩陣?

你能聯繫我到一些源代碼教程文章,甚至可能有關如何實現一個線性,三次或更好的插值與仿射轉變?

我需要在Java中實現這個問題,我知道Java有一個Affine類,但我不知道它是否實現插值。你知道任何C++或Java庫有什麼好讀的代碼,以找出如何編寫一個使用插值進行仿射變換的算法?

是否有任何免費的Java或C++庫,它們都有內置函數用於使用插值計算仿射變換?

+3

您可以使用java2d api在java中使用反鋸齒進行仿射變換 – Sibbo

+0

您是否考慮過使用比標準位圖圖像好得多的SVG圖像? Apache的[Batik庫](http://xmlgraphics.apache.org/batik/)與Java協同工作,可以爲你處理這個問題,我相信。 –

+0

@sibbo:這有助於Shapes,但對位圖圖像無幫助。 –

回答

0

好的,這裏是我結束的解決方案。

  1. 我改變了我的所有數組[] []成BufferedImage對象

    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與插值雙三次仿射變換

    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來包裝它。還有JavaCV,它包裝OpenCV。 OpenCV包含warpAffine,它具有插值。另外,請查看Java Advanced Imaging API here