径向模糊与旋转模糊

#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(){
	Mat img = imread("D://图片//5.jpg");
	if (!img.data)
		return -1;
	Mat result = img.clone();
	result.convertTo(result, CV_32F);

	Point center(img.cols / 2, img.rows / 2);
	float R, angle;
	int num;
	cout << "请输入模糊度:" << endl;
	cin >> num;

	for (int i = 0; i < img.rows; i++) {
		float *p = result.ptr<float>(i);
		for (int j = 0; j < img.cols; j++) {

			int new_x = 0, new_y = 0;
			float t0 = 0, t1 = 0, t2 = 0;
			R = sqrt((j - center.x)*(j - center.x) + (i - center.y)*(i - center.y));
			angle = atan2(float(i - center.y), float(j - center.x));

			for (int k = 0; k < num; k++) {
				//angle = angle + 0.01;   //加上就是旋转模糊
				float tem = R - k > 0 ? R-k : 0;
				new_x = tem*cos(angle) + center.x;
				new_y = tem*sin(angle) + center.y;

				if (new_x < 0)
					new_x = 0;
				if (new_x > img.cols - 1)
					new_x = img.cols - 1;
				if (new_y < 0)
					new_y = 0;
				if (new_y > img.rows - 1)
					new_y = img.rows - 1;

				t0 = t0 + img.at<Vec3b>(new_y, new_x)[0];
				t1 = t1 + img.at<Vec3b>(new_y, new_x)[1];
				t2 = t2 + img.at<Vec3b>(new_y, new_x)[2];

			}
			p[j * 3 + 0] = t0 / num;
			p[j * 3 + 1] = t1 / num;
			p[j * 3 + 2] = t2 / num;
		}
	}
	result.convertTo(result, CV_8U);
	imshow("result", result);
	waitKey(0);
	destroyAllWindows;
	return 0;
}


参考博主:http://blog.csdn.net/matrix_space

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值