import java.lang.Math.*; import java.awt.*; /** * Class containing method to apply a frequency filter to an image. * * @author Simon Horne. */ public class FreqFilter { /** * Method to apply a high or low pass filter to an image. * * @param input TwoDArray representing the image. * @param h boolean true - highpass, false - lowpass. * @return TwoDArray representing new image. */ public static TwoDArray filter(TwoDArray input, boolean lowpass, double r) { TwoDArray output = new TwoDArray(input.values, input.size, input.size); int i2, j2; double r2 = r * r; if (lowpass) {//if low pass filter for (int j = 0; j < input.size; ++j) { for (int i = 0; i < input.size; ++i) { if (i >= input.size / 2) { i2 = i - input.size; } else { i2 = i; } if (j >= input.size / 2) { j2 = j - input.size; } else { j2 = j; } double d2 = i2 * i2 + j2 * j2; if (d2 > r2) { output.values[i][j] = new ComplexNumber(0, 0); } else { output.values[i][j] = input.values[i][j]; } } } } else {//else high pass filter for (int j = 0; j < input.size; ++j) { for (int i = 0; i < input.size; ++i) { if (i >= input.size / 2) { i2 = i - input.size; } else { i2 = i; } if (j >= input.size / 2) { j2 = j - input.size; } else { j2 = j; } double d2 = i2 * i2 + j2 * j2; if (d2 > r2) { output.values[i][j] = input.values[i][j]; } else { output.values[i][j] = new ComplexNumber(0, 0); } } } } return output; } /** * Method to apply a high or low pass filter to an image. */ public static void filterCorners(double[] io, int size, boolean lowpass, double radius) { int i2, j2; double r2 = radius * radius; if (lowpass) {//if low pass filter for (int j = 0; j < size; ++j) { for (int i = 0; i < size; ++i) { i2 = i; if (i2 >= size / 2) { i2 -= size; } j2 = j; if (j2 >= size / 2) { j2 -= size; } double d2 = i2 * i2 + j2 * j2; if (d2 > r2) { io[j*size + i] = 0; } } } } else {//else high pass filter for (int j = 0; j < size; ++j) { for (int i = 0; i < size; ++i) { i2 = i; if (i2 >= size / 2) { i2 -= size; } j2 = j; if (j2 >= size / 2) { j2 -= size; } double d2 = i2 * i2 + j2 * j2; if (d2 <= r2) { io[j*size + i] = 0; } } } } } /** * Method to apply a high or low pass filter to an image. */ public static void filterCenter(double[] io, int size, boolean lowpass, double radius) { int i2, j2; double r2 = radius * radius; if (lowpass) {//if low pass filter for (int j = 0; j < size; ++j) { for (int i = 0; i < size; ++i) { i2 = i - size/2; j2 = j - size/2; double d2 = i2 * i2 + j2 * j2; if (d2 > r2) { io[j*size + i] = 0; } } } } else {//else high pass filter for (int j = 0; j < size; ++j) { for (int i = 0; i < size; ++i) { i2 = i - size/2; j2 = j - size/2; double d2 = i2 * i2 + j2 * j2; if (d2 <= r2) { io[j*size + i] = 0; } } } } } }