PhotoShop算法实现高级篇--挤压特效(三十六)

PhotoShop算法实现高级篇--挤压特效(三十六)

kezunhai@gmail.com

http://blog.csdn.net/kezunhai

        在Apple本本自带的摄像头里有挤压的功能,带小侄子玩的时候乐得嘴都合不拢。其实挤压效果的时候先是将图像向内挤压,挤压的过程产生压缩变形,从而形成的效果。挤压效果的实现是通过数学极坐标的形式,将当前像素、图像中心店和过中心点的水平线这三要素画出的一个极坐标,然后根据指定的挤压度,在当前点与中心点所连的直线上映射出一个像素点,此像素点即为目标像素点。

        先上一张图,美女(效果似曾相似不?):


       算法实现比较简单,如下:

// degree:挤压幅度(1-32)
void PhotoShop::Pinch(Mat& img, Mat& dst, int degree)
{
	if  (degree<1 ) degree = 1;
	if ( degree> 32) degree = 32;
	
	if ( dst.empty())	
		dst.create(img.rows, img.cols, img.type());		

	dst = cv::Scalar::all(0);

	int chns = img.channels();
	int height = img.rows;
	int width = img.cols;

	int midX = width/2;
	int midY =height/2;

	int i, j, k;
	int X, Y, offsetX, offsetY;
	double radian, radius;  //弧和半径

	for ( i=0; i<height; i++)
	{
		for ( j=0; j<width; j++)
		{
			offsetX = j-midX;
			offsetY = i- midY;

			radian = atan2((double)offsetY, (double)offsetX);

			// 半径
			radius = sqrtf((float)(offsetX*offsetX + offsetY*offsetY));
			radius = sqrtf(radius)*degree;

			X = (int)(radius*cos(radian))+midX;
			Y = (int)(radius*sin(radian))+midY;

			if ( X<0 ) X = 0;
			if ( X>= width) X = width - 1;
			if ( Y<0 ) Y = 0;
			if ( Y>=height) Y = height -1;

			for ( k=0; k<chns; k++)
			{
				setPixel(dst, i,j, k, getPixel(img, Y, X, k));
			}
		}
	}
}
       再来一张凤姐的老公:


再来个丑的(看你还跟鬼子混不):


哈哈,喜庆哈,丑你没商量。


        凶器没了~?~

作者:kezunhai 出处:http://blog.csdn.net/kezunhai 欢迎转载或分享,但请务必声明文章出处。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值