stereoscopy/sobel.c

76 lines
1.7 KiB
C

unsigned char** Sobel(unsigned char*** image, int width, int height)
//cf. http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html#sobel-derivatives and https://fr.wikipedia.org/wiki/Algorithme_de_Sobel
{
unsigned char** sobel;
int x,y,i;
unsigned char tempx, tempy;
if((sobel = malloc(sizeof(*sobel) * height)) == NULL)
{
perror("malloc:");
return NULL;
}
for(y = 0; y <= height; y++)
{
if((sobel[y] = malloc(sizeof(**sobel) * width)) == NULL)
{
perror("malloc:");
return NULL;
}
for(x = 0; x <= width; x++)
{
sobel[y][x] = 0;
}
}
for(y = 1; y < height; y++)
{
for(x = 1; x < width; x++)
{
tempx = -image[y-1][x-1]+image[y-1][x+1]-2*image[y][x-1]+2*image[y][x+1]-image[y+1][x-1]+image[y+1][x+1];
tempy = -image[y-1][x-1]-2*image[y-1][x]-image[y-1][x+1]+image[y+1][x-1]+2*image[y+1][x]+image[y+1][x+1];
sobel[y][x] = (int) floor(sqrt(tempx^2 + tempy^2));
}
}
return sobel;
}
unsigned char*** add2images(unsigned char*** image1, unsigned char*** image2, int width, int height, int nChannels)
{
unsigned char*** sum;
int x,y,i;
if((sum = malloc(sizeof(*sum) * height)) == NULL)
{
perror("malloc:");
return NULL;
}
for(y = 0; y <= height; y++)
{
if((sum[y] = malloc(sizeof(**sum) * width)) == NULL)
{
perror("malloc:");
return NULL;
}
}
for(y = 0; y <= height; y++)
{
for(x = 0; x <= width; x++)
{
if((sum[y][x] = malloc(sizeof(***sum) * nChannels)) == NULL) //sum[y][x][R,G,B]
{
perror("malloc:");
return NULL;
}
for(i = 0; i < nChannels; i++)
{
sum[y][x] = (unsigned char) ((image1[y][x][i] + image2[y][x][i])/2);
}
}
}
return sum;
}