int MinPos, MaxPos, Start, End;
int TargetSize, SampleSizeW, SampleSizeH;
int TargetArea = TargetSize*TargetSize;
double[] Target = new double[TargetArea];
double[] preSample = new double[TemplateSize*TemplateSize];
double[] Sample = new double[TemplateSize*TemplateSize];
img1 = loadImage("SampleNeuronSlice.jpg");
img2 = loadImage("SampleNeuron.jpg");
img64 = loadImage("Blank128.jpg");
img32 = loadImage("Blank32.jpg");
int TargetSize = img1.height;
int SampleSizeW = img2.width;
int SampleSizeH = img2.height;
size(TargetSize, TargetSize);
Target = intToDouble(img1.pixels);
preSample = intToDouble(img2.pixels);
average = averageRegion(preSample, SampleSizeW, SampleSizeH, SampleSizeW, SampleSizeH);
fillRegion(preSample, Sample, TemplateSize, TemplateSize, SampleSizeW, SampleSizeH, (int)(average+.5));
double[] Master = new double[TargetSize*TargetSize];
for(int iy = 0; iy < TargetSize; iy+=TemplateSize){
for(int ix = 0; ix < TargetSize; ix+=TemplateSize){
double[] b = findSquare(Target, ix, iy, TemplateSize, TemplateSize, TargetSize);
double[] master = masterFourier(Sample, b, TemplateSize*TemplateSize);
Master = replaceSquare(master, Master, ix, iy, TemplateSize, TemplateSize, TargetSize, TemplateSize*TemplateSize);
findMinMax(Master, TargetSize*TargetSize);
printArraytoPic(Master, img1);
double[] masterFourier(double[] Sample, double[] Target, int TargetArea){
double[] Temp = new double[TargetArea];
sampleCopy(Temp, Sample, TargetArea);
double[] zeroSet = new double[TargetArea];
double[] zeroSet2 = new double[TargetArea];
zeroFill(zeroSet, TargetArea);
zeroFill(zeroSet2, TargetArea);
FFT(1, TargetArea, Temp, zeroSet);
FFT(1, TargetArea, Target, zeroSet2);
negiArray(zeroSet, TargetArea);
multiFFT(Target, zeroSet, Temp, zeroSet2, TargetArea);
FFT(-1, TargetArea, Target, zeroSet2);
double averageCell(double[] a, int n){
for( int i = 0; i<n; i++){
double standardDeviation(double[] a, int n){
double average = averageCell(a, n);
for( int i =0; i<n; i++){
sDev+=(a[i] - average)*(a[i] - average);
sDev = sqrt((float)sDev);
void sampleCopy(double[] a, double[] b, int n) {
for (int i=0; i<n; i++) {
double[] intToDouble(int[] pix)
double[] dubs = new double[pix.length];
for ( int i = 0; i < pix.length; i++)
dubs[i] = (double)pix[i];
void findMinMax(double[] a, int n){
float averageRegion(double[] a, int Width, int Height, int subWidth, int subHeight) {
for (int y=0; y<subHeight; y++) {
for (int x=0; x<subWidth; x++) {
sum /= (subWidth*subHeight);
void fillRegion(double[] a, double[] b, int Width, int Height, int subWidth, int subHeight, int average) {
for (int y = 0; y<subHeight; y++) {
for (int x = 0; x<subWidth; x++) {
b[x+offset] = a[x+y*subWidth];
for (int x = subWidth; x<Width; x++) {
for (int y=subHeight; y<Height; y++) {
for (int x=0; x<Width; x++) {
void turnGray(PImage image) {
for ( int i = 0; i< image.pixels.length; i++)
r = (clour >> 16) & 0xFF;
set( i % image.width, i / image.width, color(doriangray));
image.pixels[i] = doriangray;
void printArraytoPic(double[] a, PImage image) {
int Height = image.height;
for (int y=0; y<Height; y++) {
for (int x=0; x<Width; x++) {
V = (int)(255*((a[y*Width+x]-Min)/(Max-Min)));
int twoDtoOneD(int x, int y, int wideth)
void counterFill(double[] a, int n) {
for (int i=0; i<n; i++) {
double[] findSquare(double[] a, int x, int y, int dx, int dy, int wideth) {
double[] b = new double[dx*dy];
for (int iy = 0; iy < dy; iy++) {
for (int ix = 0; ix < dx; ix++) {
b[counter] = a[twoDtoOneD(ix+x, iy+y, wideth)];
double[] replaceSquare(double[] a, double[]b, int x, int y, int dx, int dy, int Width, int n) {
double average = averageCell(a, n);
double sDev = standardDeviation(a, n);
for (int iy = 0; iy < (dy); iy++) {
for (int ix = 0; ix < dx; ix++) {
b[twoDtoOneD(ix+x, iy+y, Width)] = (a[counter]-average)/sDev;
void printArray(double[] a, int n) {
void zeroFill(double[] a, int n) {
for (int i=0; i<n; i++) {
void multiFFT(double [] re1, double [] im1, double [] re2, double [] im2, int n) {
tempReal = re1[i] * re2[i] - im1[i] * im2[i];
tempImag = re1[i] * im2[i] + re2[i] * im1[i];
void negiArray(double [] array, int n) {
for (i = 0; i < n; i++) {
void FFT(int dir, int n, double [] x, double [] y)
int m, i, i1, j, k, i2, l, l1, l2;
double c1, c2, tx, ty, t1, t2, u1, u2, z;
for (m=1; (n>>m)!=1; m++)
t1 = u1 * x[i1] - u2 * y[i1];
t2 = u1 * y[i1] + u2 * x[i1];
c2 = sqrt((float)((1.0 - c1) / 2.0));
c1 = sqrt((float)((1.0 + c1) / 2.0));