滤镜之浮雕Emboss

首先看效果图:


 

这个算法是一个像素和它周围像素的差值加上一个灰度常数产生浮雕效果的图像。一般是和它左上方像素的差值为浮雕,是一种凸的效果,和右下角像素的差为雕刻,是一种凸的效果。代码中通过cos角度控制梯度方向。

 

这个滤镜在ImageStone这个软件中有完整代码,现在改写如下:

#define PI 3.1415926535897932384626433832795
void EmbossRGB(unsigned char* pInput,unsigned char* pOutput,int width,int height,int nStride,int nAngle)
{
	int intensity;
	unsigned char* src = pInput;
	unsigned char* dst = pOutput;
	unsigned char* p;
	int i,j,x,y,t;
	int offset = nStride-width*3;

	float dr = PI/4;
	float Weights[3][3];	
	float r = nAngle*PI/180.0;

	float sum = 0;

	if(pInput == NULL || pOutput == NULL)
		return;

	if(width <= 0 || height <= 0)
		return;
	
	Weights[0][0] = cos(r + dr) ;
	Weights[0][1] = cos(r + 2.0*dr) ;
	Weights[0][2] = cos(r + 3.0*dr) ;

	Weights[1][0] = cos(r) ;
	Weights[1][1] = 0 ;
	Weights[1][2] = cos(r + 4.0*dr) ;

	Weights[2][0] = cos(r - dr) ;
	Weights[2][1] = cos(r - 2.0*dr) ;
	Weights[2][2] = cos(r - 3.0*dr) ;

	// for each line
	for ( y = 0; y < height; y++ )
	{
		// for each pixel
		for ( x = 0; x < width; x++, src += 3, dst += 3 )
		{

			sum = 0;
			// for each kernel row
			for ( i = -1; i <= 1; i++ )
			{
				t = y + i;
				// skip row
				if ( t < 0 )
					continue;
				// break
				if ( t >= height )
					break;

				// for each kernel column
				for ( j = -1; j <= 1; j++ )
				{
					t = x + j;
					// skip column
					if ( t < 0 )
						continue;

					if ( t < width )
					{
						p = &src[i * nStride + j * 3];
						intensity = (int)( 0.2125 * (*p) + 0.7154 * (*(p+1))) + 0.0721 * (*(p+2));

						sum += intensity*Weights[i+1][j+1];
					}
				}
			}

			sum += 128;
			if(sum < 0)
				sum = 0;
			if(sum > 255)
				sum = 255;

			*dst = (unsigned char)sum;
			*(dst+1) = (unsigned char)(sum);
			*(dst+2) = (unsigned char)(sum);
		}
		src += offset;
		dst += offset;
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值