2012-05-29 2 views
2

내가하려는 것은 Java에있는 이미지의 2D DCT를 계산 한 다음 그 결과를 다시 파일에 저장하는 것입니다.jTransforms를 사용하는 png의 DCT2

읽기 파일 다음 DCT

cover = convertToFloatArray(coverImage); 
private float[] convertToFloatArray(BufferedImage source) { 

     securedImage = (WritableRaster) source.getData(); 

     float[] floatArray = new float[source.getHeight() * source.getWidth()]; 
     floatArray = securedImage.getPixels(0, 0, source.getWidth(), source.getHeight(), floatArray); 

     return floatArray; 

    } 

실행 :

runDCT(cover, coverImage.getHeight(), coverImage.getWidth()); 
private void runDCT(float[] floatArray, int rows, int cols) { 

     dct = new FloatDCT_2D(rows, cols); 

     dct.forward(floatArray, false); 

     securedImage.setPixels(0, 0, cols, rows, floatArray); 

    } 

을 그리고 이미지로 저장 :

coverImage = readImg(coverPath); 
private BufferedImage readImg(String path) { 

     BufferedImage destination = null; 

     try { 

      destination = ImageIO.read(new File(path)); 

     } catch (IOException e) { 

      e.printStackTrace(); 

     } 

     return destination; 

    } 

변환 배열을 떠하기

convertDctToImage(securedImage, coverImage.getHeight(), coverImage.getWidth()); 
private void convertDctToImage(WritableRaster secured, int rows, int cols) { 

     coverImage.setData(secured); 

     File file = new File(securedPath); 
     try { 
      ImageIO.write(coverImage, "png", file); 
     } catch (IOException ex) { 
      Logger.getLogger(DCT2D.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

하지만 내가 얻는 것은 : http://kyle.pl/up/2012/05/29/dct_stack.png

내가 뭘 잘못하고 있는지 말해 줄 사람이 있을까요? 아니면 여기서 뭔가를 이해하지 못했을까요?

답변

0

이것은 나를 위해 작동하는 코드의 일부입니다 :

//reading image 
BufferedImage image = javax.imageio.ImageIO.read(new File(filename)); 

//width * 2, because DoubleFFT_2D needs 2x more space - for Real and Imaginary parts of complex numbers 
double[][] brightness = new double[img.getHeight()][img.getWidth() * 2]; 

//convert colored image to grayscale (brightness of each pixel) 
for (int y = 0; y < image.getHeight(); y++) { 
    raster.getDataElements(0, y, image.getWidth(), 1, dataElements); 
    for (int x = 0; x < image.getWidth(); x++) { 
     //notice x and y swapped - it's JTransforms format of arrays 
     brightness[y][x] = brightnessRGB(dataElements[x]); 
    } 
} 

//do FT (not FFT, because FFT is only* for images with width and height being 2**N) 
//DoubleFFT_2D writes data to the same array - to brightness 
new DoubleFFT_2D(img.getHeight(), img.getWidth()).realForwardFull(brightness); 

//visualising frequency domain 
BufferedImage fd = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB); 
outRaster = fd.getRaster(); 
for (int y = 0; y < img.getHeight(); y++) { 
    for (int x = 0; x < img.getWidth(); x++) { 
     //we calculate complex number vector length (sqrt(Re**2 + Im**2)). But these lengths are to big to 
     //fit in 0 - 255 scale of colors. So I divide it on 223. Instead of "223", you may want to choose 
     //another factor, wich would make you frequency domain look best 
     int power = (int) (Math.sqrt(Math.pow(brightness[y][2 * x], 2) + Math.pow(brightness[y][2 * x + 1], 2))/223); 
     power = power > 255 ? 255 : power; 
     //draw a grayscale color on image "fd" 
     fd.setRGB(x, y, new Color(c, c, c).getRGB()); 
    } 
} 

draw(fd); 

결과 이미지는 네 모서리의 중간에 큰 검은 공간과 흰색 반점처럼 보일 것입니다. 보통 사람들은 FD를 시각화하여 이미지의 중앙에 0이 나타나게합니다. 당신이 (실생활 이미지 스타처럼 보이는 하나) 고전 FD를 필요로한다면, 당신은 ... ", y를 fd.setRGB (x '를 업그레이드 조금 필요

int w2 = img.getWidth()/2; 
int h2 = img.getHeight()/2; 
int newX = x + w2 >= img.getWidth() ? x - w2 : x + w2; 
int newY = y + h2 >= img.getHeight() ? y - h2 : y + h2; 

fd.setRGB(newX, newY, new Color(power, power, power).getRGB()); 

brightnessRGB 및 방법을 그립니다 게으른 :..

내가 아는
public static int brightnessRGB(int rgb) { 
    int r = (rgb >> 16) & 0xff; 
    int g = (rgb >> 8) & 0xff; 
    int b = rgb & 0xff; 
    return (r+g+b)/3; 
} 
private static void draw(BufferedImage img) { 
    JLabel picLabel = new JLabel(new ImageIcon(img)); 
    JPanel jPanelMain = new JPanel(); 
    jPanelMain.add(picLabel); 
    JFrame jFrame = new JFrame(); 
    jFrame.add(jPanelMain); 
    jFrame.pack(); 
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jFrame.setVisible(true); 
} 

, 내가 조금 늦게 해요,하지만 난 그냥 모든 것을 내 프로그램에 그래서, 여기에 인터넷 검색에서 여기 얻을 것이다 사람들을위한하자 않았다