Buen día, he estado usando un poco la librería CImg en C++. El problema que tengo en estos momentos, es como aplicar un filtro Sobel a una imagen.
Cargo la imagen en escala de grises y aplico el código siguiente.
int GX[3][3];
int GY[3][3];
GX[0][0] = -1; GX[0][1] = 0; GX[0][2] = 1;
GX[1][0] = -2; GX[1][1] = 0; GX[1][2] = 2;
GX[2][0] = -1; GX[2][1] = 0; GX[2][2] = 1;
GY[0][0] = 1; GY[0][1] = 2; GY[0][2] = 1;
GY[1][0] = 0; GY[1][1] = 0; GY[1][2] = 0;
GY[2][0] = -1; GY[2][1] = -2; GY[2][2] = -1;
unsigned char X, Y;
CImg<unsigned char> XX(width,height,depth,1);
CImg<unsigned char> YY(width,height,depth,1);
imfinalsob.assign(width, height, depth,1);
for(int i=1;i<width-1;i++)
{
for(int j=1;j<height-1;j++)
{
X = (sobel(i-1, j-1)*GX[0][0]) + (sobel(i-1, j)*GX[0][1]) + (sobel(i-1, j+1)*GX[0][2]) +
(sobel(i, j-1)*GX[1][0]) + (sobel(i, j)*GX[1][1]) + (sobel(i, j+1)*GX[1][2]) +
(sobel(i+1, j-1)*GX[2][0]) + (sobel(i+1, j)*GX[2][1]) + (sobel(i+1, j+1)*GX[2][2]);
Y = (sobel(i-1, j-1)*GY[0][0]) + (sobel(i-1, j)*GY[0][1]) + (sobel(i-1, j+1)*GY[0][2]) +
(sobel(i, j-1)*GY[1][0]) + (sobel(i, j)*GY[1][1]) + (sobel(i, j+1)*GY[1][2]) +
(sobel(i+1, j-1)*GY[2][0]) + (sobel(i+1, j)*GY[2][1]) + (sobel(i+1, j+1)*GY[2][2]);
XX(i,j)=X/4;
YY(i,j)=Y/4;
imfinalsob(i,j)= XX(i,j)+YY(i,j);
}
}
CImgDisplay img_d(imfinalsob, "Sobel");
img_d.wait(4000).close();
El resultado final es una imagen que en vez de un filtro Sobel, parece un tipo de piedra. Espero alguien pueda ayudarme o indicarme en que parte del algoritmo tengo el error.
Muchas gracias de antemano.