Sobel算子:
公式:
梯度大小:
梯度方向:
#define pow_2(x) ((x)*(x))
typedef struct PointStruct {
int x , y;
}PointS , PixelVector;
bool SobelCheck( PointS ip, char* curSignal, int frameWidth, int frameHigh ) {
if( ip.x < 1 || ip.y < 1 || ip.x >= frameWidth - 1 || ip.y >= frameHigh - 1 )
{ return false; }
const int Gx[3][3] = {
-1 , 0 , 1 ,
-2 , 0 , 2 ,
-1 , 0 , 1
};
const int Gy[3][3] = {
1 , 2 , 1 ,
0 , 0 , 0 ,
-1 , -2 , -1
};
const int dir[9][2] = {
-1 , -1 , -1 , 0 , -1 , 1 ,
0 , -1 , 0 , 0 , 0 , 1 ,
1 , -1 , 1 , 0 , 1 , 1
};
const int threshold = 100;
int tx , ty , tsignal;
int G1 , G2;
G1 = G2 = 0;
for( int i = 0 ; i < 3 ; ++i ) {
for( int j = 0 ; j < 3 ; ++j ) {
tx = ip.x + dir[i * 3 + j][0];
ty = ip.y + dir[i * 3 + j][1];
tsignal = curSignal[tx + ty * frameWidth];
G1 += Gx[i][j] * tsignal;
G2 += Gy[i][j] * tsignal;
}
}
int G;
G = ( int )( pow_2( ( Double )G1 ) + pow_2( ( Double ) G2 ) );
if( G > threshold * threshold )
{ return true; }
return false;
}
原图:
阈值threshold为100,效果图:
阈值threshold为200,效果图: