#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

const int NB=1;
const int GB=1;
unsigned char* inputImage;
unsigned char* outputImage;
int pictureWidth;
int pictureHight;

void GaussBlur(unsigned char* gauss_image){
	char Gauss[]={99, 68, 35, 10};
	unsigned char g_tmp_image[pictureWidth][pictureHight];
	int g_acc; //can be only 16 bits
	int tot=0; //can be only 16 bits
	for(int k=-GB; k<=GB; k++){
		tot+=Gauss[abs(k)];
	}
	/*
	 * Horisontal Gaussian blur
	 */
	for(int x=0; x<pictureWidth; x++){
		for(int y=0; y<pictureHight; y++){
			g_tmp_image[x][y]=0;
		}
	}
	for(int x=GB; x<pictureWidth-GB; x++){
		for(int y=GB; y<pictureHight-GB; y++){
			g_acc=0;
			for(int k=-GB; k<=GB; k++){
				g_acc+=inputImage[x+k + pictureWidth*y]*Gauss[abs(k)];
			}
			g_tmp_image[x][y]=g_acc/tot;
		}
	}
	/*
	 * Vertical Gaussian blur
	 */
	for(int i=0; i<pictureWidth*pictureHight; i++){
		gauss_image[i]=0;
	}
	for(int x=GB; x<pictureWidth-GB; x++){
		for(int y=GB; y<pictureHight-GB; y++){
			g_acc=0;
			for(int k=-GB; k<GB; k++){
				g_acc+=g_tmp_image[x][y+k]*Gauss[abs(k)];
			}
			gauss_image[x + y*pictureWidth]=g_acc/tot;
		}
	}
}

void ComputeEdges(unsigned char* gauss_image){
	char maxdiff, val;

	for(int i=0; i<pictureWidth*pictureHight; i++){
		outputImage[i]=0;
	}

	for(int x=NB; x<pictureWidth-NB; x++){
		for(int y=NB; y<pictureHight-NB; y++){
			maxdiff=0;
			for(int k=-NB; k<=NB; k++){
				for(int l=-NB; l<=NB; l++){
					if(k!=0 || l!=0){
						val=abs( ((int)gauss_image[x+k +pictureWidth*(y+1)])- gauss_image[x + pictureWidth*y]);
						if(val>maxdiff){
							maxdiff=val;
						}
					}
				}
			}
			outputImage[x + pictureWidth*y]=maxdiff;
		}
	}
}

void outputPicture(char *fileName)
{
  FILE *f;

  cout<<"Output picture"<<endl;

  /* Open file */

  if(!(f=fopen(fileName,"wt+")))
  {
    printf("%s Can't open file\n",fileName);
  }

  fprintf(f, "P2\n");
  fprintf(f,"%d %d\n", pictureWidth, pictureHight);
  fprintf(f,"255\n");

  for(int i=0; i<pictureHight*pictureWidth; i++){
	  fprintf(f,"%d\n", outputImage[i]);
  }

  fclose(f);
}

void readingPicture(char *fileName){
	cout<<"reading Picture "<<fileName<<endl;
	string line;
	ifstream pictureFile (fileName);
	if (pictureFile.is_open())
	{
		while ( pictureFile.good() )
		{
			getline (pictureFile,line);
			if(!(line[0]=='P' && line[1]=='2')) break;
			getline (pictureFile,line);
			while(line[0]=='#'){
				getline (pictureFile,line);
			}
			int spaceIndex=line.find_first_of(" ");
			pictureWidth=atoi(line.substr(0, spaceIndex).c_str());
			pictureHight=atoi(line.substr(spaceIndex+1, line.size()).c_str());
			cout << pictureWidth <<"  "<<pictureHight<< endl;
			inputImage= new unsigned char[pictureWidth*pictureHight];
			getline (pictureFile,line);
			getline (pictureFile,line);
			for(int i=0; i<pictureHight*pictureWidth; i++){
				int spaceIndex=line.find_first_of(" ");
				if(spaceIndex==-1){
					inputImage[i]=atoi(line.substr(0, line.size()).c_str());
					getline (pictureFile,line);
				}else{
					inputImage[i]=atoi(line.substr(0, spaceIndex).c_str());
					line=line.substr(spaceIndex+1, line.size());
				}
			}
		}
		pictureFile.close();
	}
  else cout << "Unable to open file"<<endl;
}

int main(){
	readingPicture("goldenBridge.pgm");
	unsigned char* gaussImage;
	gaussImage=new unsigned char[pictureWidth*pictureHight];
	GaussBlur(gaussImage);
	outputImage=new unsigned char[pictureWidth*pictureHight];
	ComputeEdges(gaussImage);
	outputPicture("outputPicture.pgm");
	return 0;
}

<div align="center"><br /><script type="text/javascript"><!--
google_ad_client = "pub-7293844627074885";
//468x60, Created at 07. 11. 25
google_ad_slot = "8619794253";
google_ad_width = 468;
google_ad_height = 60;
//--></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />&nbsp;</div>