Sobel边缘检测

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,效果图:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值