#include <cv.h>
#include <highgui.h>
using namespace std;
int main()
{
//D閏laration / initalisation des images
IplImage *img=cvLoadImage("lena.jpg");
IplImage *src=cvCreateImage(cvGetSize(img), img->depth, 1);
IplImage *img_inv=cvCloneImage(src);
cvNamedWindow("lena",CV_WINDOW_AUTOSIZE);
cvNamedWindow("laplacien",CV_WINDOW_AUTOSIZE);
int voisinage=3;
//Conversion en niveaux de gris
cvConvertImage(img, src, 0);
CvRect roi=cvRect(0,0,voisinage,voisinage);
//On initialise un entier, pour la moyenne
int moyenne=0;
//Un petit scalaire pour la route ^^
CvScalar scalaire;
int *voisins=new int[voisinage*voisinage];
for(int x=0; x<src->width; x++)
{
for(int y=0; y<src->height; y++)
{
//Pour chaque pixel
//S'il est trop "au bord" :
if(x<(voisinage-1)/2 || x>(src->width - 1 - (voisinage-1)/2) || y<(voisinage-1)/2 || y>(src->height - 1 - (voisinage-1)/2))
{
//Dans ce cas on recopie simplement le pixel
cvSet2D(img_inv, y, x, cvGet2D(src, y, x));
}else
{
//On centre le voisinage sur le pixel en cours
roi.x= x - (voisinage-1)/2;
roi.y= y - (voisinage-1)/2;
//On initialise la r間ion d'int閞阾
cvSetImageROI(src, roi);
//On parcourt le voisinage
for(int i=0; i<voisinage; i++)
{
for(int j=0; j<voisinage; j++)
{
//On r閏up鑢e les valeurs du voisinage
scalaire = cvGet2D(src, j, i);
voisins[i*voisinage + j] = scalaire.val[0];
}
}
//On rel鈉he la r間ion d'int閞阾
cvResetImageROI(src);
scalaire.val[0]=-voisins[0]*1-voisins[1]*1-voisins[2]*1-voisins[3]*1+voisins[4]*8-voisins[5]*1-voisins[6]*1-voisins[7]*1-voisins[8]*1;
//On la remplace dans l'image de destination
cvSet2D(img_inv, y, x, scalaire);
}
}
}
delete[] voisins;
cvShowImage("lena", img);
cvShowImage("laplacien", img_inv);
cvWaitKey(0);
cvDestroyWindow("lena");
cvDestroyWindow("laplacien");
cvReleaseImage(&img);
cvReleaseImage(&img_inv);
return 0;
}