DCT буферизованного изображения с использованием JTransform - Java

1

Я пытаюсь получить DCT из bufferedImage, используя JTransform. Когда я визуализую преобразование, оно в настоящее время выглядит так: http://tinypic.com/r/2vcxhzo/8

Для использования Jtransform мне нужно преобразовать BufferedImage в 2d двойной массив. Я пробовал два разных метода, чтобы изменить bufferedImage на двойной массив

    public double[][] convertTo2DArray(BufferedImage image) {

        final byte[] pixels = ((DataBufferByte) image.getRaster()
        .getDataBuffer()).getData();
        final int width = image.getWidth();
        final int height = image.getHeight();

        double[][] result = new double[height][width];

        final boolean hasAlphaChannel = image.getAlphaRaster() != null;
        if (hasAlphaChannel) {
           final int pixelLength = 4;
           for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
               int argb = 0;
               argb += (((int) pixels[pixel] & 0xff) << 24); // alpha
               argb += ((int) pixels[pixel + 1] & 0xff); // blue
               argb += (((int) pixels[pixel + 2] & 0xff) << 8); // green
               argb += (((int) pixels[pixel + 3] & 0xff) << 16); // red
               result[row][col] = argb;
               col++;
            if (col == width) {
                col = 0;
                row++;
            }
        }
       } else {
          final int pixelLength = 3;
          for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += pixelLength) {
            int argb = 0;
            argb += -16777216; // 255 alpha
            argb += ((int) pixels[pixel] & 0xff); // blue
            argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green
            argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red
            result[row][col] = argb;
            col++;
            if (col == width) {
                col = 0;
                row++;
            }
        }
    }

    return result;
}

Я тоже пробовал

private double[][] bufferedImageToArray(BufferedImage image) {
    int h = image.getHeight();
    int w = image.getWidth();
    int[][] array = new int[h][w];
    double[][] result;    

    for (int count = 0; count < h; count++) {
        for (int loop = 0; loop < w; loop++) {

            int gray = image.getRGB(loop, count) & 0xFF;

            // add values to array
            array[count][loop] = gray;
        }
    }
    result = toDoubleArray(array);
    return result;
}

Я реализовал преобразование как

public double[][] applyDCT(double[][] image) {

    DoubleDCT_2D transform = new DoubleDCT_2D(image.length, image[0].length);

    transform.forward(image, true);

    return image;
}

Я пробовал использовать преобразование с открытым кодом OpenCV, но он дает тот же результат, что и в ссылке.

Теги:
image-processing

2 ответа

0
Лучший ответ

Ты что-то вроде этого (для простоты я сохранил только синий канал). Он показывает энергетическое уплотнение в верхнем левом углу изображения результата.

import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestDCT
{
  public static void main(String[] args)
  {
    ImageIcon icon = new ImageIcon(args[0]);
    Image image = icon.getImage();
    int w = image.getWidth(null);
    int h = image.getHeight(null);
    GraphicsDevice gs = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0];
    GraphicsConfiguration gc = gs.getDefaultConfiguration();
    BufferedImage img = gc.createCompatibleImage(w, h, Transparency.OPAQUE);
    img.getGraphics().drawImage(image, 0, 0, null);
    int[] rgb1 = new int[w*h];
    img.getRaster().getDataElements(0, 0, w, h, rgb1);
    double[] array = new double[w*h];

    for (int i=0; i<w*h; i++)
       array[i] = (double) (rgb1[i] & 0xFF);

    org.jtransforms.dct.DoubleDCT_2D tr = new org.jtransforms.dct.DoubleDCT_2D(w, h);
    tr.forward(array, true);

    for (int i=0; i<w*h; i++)
    {
       // Grey levels
       int val= Math.min((int) (array[i]+128), 255);
       rgb1[i] = (val <<16) | (val << 8) | val;
    }

    img.getRaster().setDataElements(0, 0, w, h, rgb1);
    icon = new ImageIcon(img);
    JFrame frame = new JFrame("FFT");
    frame.setBounds(20, 30, w, h);
    frame.add(new JLabel(icon));
    frame.setVisible(true);
  }

}

0

У меня есть изображение в серой шкале, и я хочу увидеть полученное изображение после применения в нем кода, я попытался сместить бит с помощью << 24, но в результате получилось полностью плоское серое изображение, можете ли вы помочь мне с этим?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню