//**************************************************************************
//
// CSE 585 Project #1
// By Anirudh Modi (anirudh@bart.aero.psu.edu) on 3/10/2000-Fri
// & Shin Chin (scc136@psu.edu)
// & Ming Ni (ni@cse.psu.edu)
//
//**************************************************************************
// Running time of algorithm -> O[width x height]
//**************************************************************************
// Have implemented the following ->
// 1. Smoothening of histogram to determine minima/maxima
// 2. Basic image operations (+, -, =)
// 3. There is no memory leak
//**************************************************************************
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h> // for atoi()
#include <string.h>
#include <math.h>
#include "image.h"
//**************************************************************************
//#define GAUSSIAN_NOISE
//**************************************************************************
void myFilter(int type, int N, GrayImage *img, char *name);
//**************************************************************************
int main (int argc, char *argv[])
{
GrayImage origImage, noisyImage, filteredImage;
char name[50], filtername[20];
double err, err2, err_noise_orig;
char imagefile[][20]={"lenna", "peppers", "cleanwheel"};
int numfiles = sizeof(imagefile)/sizeof(char[20]);
ofstream out("RMS.out");
int noise_percent = 20;
int mean = 0;
int std_dev = 1;
for (int i = 0; i < numfiles; i++)
#ifdef GAUSSIAN_NOISE
for (int dev = 1; dev <= 21; dev += 4)
#else
for (int percent = 5; percent <= 25; percent += 5)
#endif
{
sprintf(name,"images/%s.pgm",imagefile[i]);
origImage.ReadFromFile(name);
noisyImage = origImage;
#ifdef GAUSSIAN_NOISE
noisyImage.addGaussianNoise(mean*1.0,dev*dev*1.0);
sprintf(name,"%s_gnoise%02d.dat",imagefile[i],dev);
#else
noisyImage.addSaltandPepperNoise(percent*1.0);
sprintf(name,"%s_spnoise%02d.dat",imagefile[i],percent);
#endif
err_noise_orig = RMSerror(&noisyImage, &origImage);
noisyImage.WriteToFile(name);
for (int type = 1; type <= 4; type++)
for (int N = 3; N <= 7; N += 2)
{
filteredImage = noisyImage;
myFilter(type, N, &filteredImage, filtername);
err = RMSerror(&origImage, &filteredImage);
err2 = RMSerror(&noisyImage, &filteredImage);
cout << "RMS error for " << N << "x" << N << " "
<< filtername << " filter = " << err << endl;
cout << "RMS error between noisy image and filtered image = "
<< err2 << " (between orig and noise = "
<< err_noise_orig << ")" << endl;
#ifdef GAUSSIAN_NOISE
sprintf(name,"%s_gnoise%02d_%s_%dx%d.dat",imagefile[i],
dev, filtername, N, N);
#else
sprintf(name,"%s_spnoise%02d_%s_%dx%d.dat",imagefile[i],
percent, filtername, N, N);
#endif
out << name << " " << err << " " << err2
<< " " << err_noise_orig << endl;
out.flush();
filteredImage.WriteToFile(name);
}
}
out.close();
}
//**************************************************************************
void myFilter(int type, int N, GrayImage *img, char *name)
{
switch (type)
{
case 1:
strcpy(name,"mean");
img->MeanFilterNxN(N);
break;
case 2:
strcpy(name,"median");
img->MedianFilterNxN(N);
break;
case 3:
strcpy(name,"gaussian");
img->GaussianFilterNxN(N);
break;
case 4:
strcpy(name,"kNearest");
img->kNearestNeighboringFilterNxN(N);
break;
default:
break;
}
}
//**************************************************************************