简体   繁体   中英

Gabor wavelets in 2d image

I use lire, java for image retrieval project and I want to calculate the amplitude of gabor wavelet for every pixel of my input image ref here . The default function in lire library return a downsampled feature vector. What I want the computed amplitude of the gabor wavelets. I am trying to create a function getMagnitude:

public double[][] getMagnitude(BufferedImage image) {
    image = ImageUtils.scaleImage(image, MAX_IMG_HEIGHT);

    Raster imageRaster = image.getRaster();
    System.out.println(imageRaster);
    int[][] grayLevel = new int[imageRaster.getWidth()][imageRaster.getHeight()];

    int[] tmp = new int[3];
    for (int i = 0; i < imageRaster.getWidth(); i++) {
        for (int j = 0; j < imageRaster.getHeight(); j++) {
            grayLevel[i][j] = imageRaster.getPixel(i, j, tmp)[0];
        }
    }

    double[][] magnitudes = computeMagnitudes(grayLevel);

    return magnitudes;
}

The gabor features are class gabor private variables:

private static final double U_H = .4;
private static final double U_L = .05;
private static final int S = 1, T = 1; // filter mask size
private static final int M = 4, N = 5; // scale & orientation

private static final int MAX_IMG_HEIGHT = 64;

Moreover, it seems that the size of the final magnitude array is affected from the size of M, N scale and orientation. What I ve got to do in order to get the case I want?

COmpute magnitude function:

 private double[][] computeMagnitudes(int[][] image) {
    double[][] magnitudes = new double[M][N];
    for (int i = 0; i < magnitudes.length; i++) {
        for (int j = 0; j < magnitudes[0].length; j++) {
            magnitudes[i][j] = 0.;
        }
    }

    if (this.gaborWavelet == null) {
        precomputeGaborWavelet(image);
    }

    for (int m = 0; m < M; m++) {
        for (int n = 0; n < N; n++) {
            for (int x = S; x < image.length; x++) {
                for (int y = T; y < image[0].length; y++) {
                    magnitudes[m][n] += Math.sqrt(Math.pow(this.gaborWavelet[x - S][y - T][m][n][0], 2) + Math.pow(this.gaborWavelet[x - S][y - T][m][n][1], 2));

                }
            }
        }
    }
    return magnitudes;
}

I think that you ve got to use 5d private double[][][][][] gaborWavelet which is actually calculate the convolution between the image and mother wavelets.

 private double[] gaborWavelet(int[][] img, int x, int y, int m, int n) {
    double re = 0;
    double im = 0;
    for (int s = 0; s < S; s++) {
        for (int t = 0; t < T; t++) {
            re += img[x][y] * selfSimilarGaborWavelets[s][t][m][n][0];
            im += img[x][y] * -selfSimilarGaborWavelets[s][t][m][n][1];
        }
    }

    return new double[]{re, im};
}

You have to choose M, N , S, T and the returned wavelets contains two matrices for re and im.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM