|
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;
|
}
|
}
|
}
|
}
|
}
|
}
|