1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| void filtreSobel(IplImage *src, IplImage *dst)
{
CvScalar scalaire;
float SobelX[]={-1, 0, 1, -2, 0, 2, -1, 0, 1};
float SobelY[]={1, 2, 1, 0, 0, 0, -1, -2, -1};
CvMat M_SobelX = cvMat(3, 3, CV_32FC1, SobelX);
CvMat M_SobelY = cvMat(3, 3, CV_32FC1, SobelY);
CvMat *M_Tmp = cvCreateMat(3,3,CV_32FC1);
CvMat *M_Tmp2 = cvCreateMat(3,3,CV_32FC1);
float *data_M_Tmp = M_Tmp->data.fl;
for (int x=1; x<src->width-1; x++)
{
for (int y=1; y<src->height-1; y++)
{
CvRect mon_rectangle = cvRect(x-1, y-1, 3 , 3);
//Je définis la région d'intérêt de mon image.
cvSetImageROI(src, mon_rectangle);
cvSetImageROI(dst, mon_rectangle);
for (int tmp_x=0; tmp_x<3; tmp_x++)
{
for (int tmp_y=0; tmp_y<3; tmp_y++)
data_M_Tmp[tmp_x*3+tmp_y] = (float)(cvGet2D(src, tmp_x, tmp_y)).val[0];
}
cvMatMul(&M_SobelY, M_Tmp, M_Tmp2);
if (cvmGet(M_Tmp2,1,1)<0)
scalaire.val[0] = 0;
else if (cvmGet(M_Tmp2,1,1)>255)
scalaire.val[0] = 255;
else
scalaire.val[0] = (int)cvmGet(M_Tmp2,1,1);
cvSet2D (dst, 1, 1, scalaire);
//Maintenant je relâche la région d'intérêt
cvResetImageROI(src);
cvResetImageROI(dst);
}
}
} |
Partager