【opencv】几何变换——极坐标变换(6 利用极坐标变换对图像进行变换)

  • 先确定输出图像的宽、高,以及r和θ的最小值和变换步长,从而估算r和θ的最大值
  • 利用repeat(const Mat& src,int ny,int nx)函数实现矩阵的平铺
  • src:输入矩阵
  • ny:将src在垂直方向上重复ny次
  • nx:将src在水平方向上重复nx次
#include
using namespace std;
#include
#include
#include
using namespace cv;
//Point2f表示Point类的两个数据x,y为float类型;
Mat polar(Mat I, Point2f center, Size size, float minr = 0, float mintheta = 0, float thetaStep = 1.0 / 4, float rStep = 1.0)
{   //构建r
	Mat ri = Mat::zeros(Size(1, size.height), CV_32FC1);
	for (int i = 0; i < size.height; i++)
	{
	//at(i, 0)访问Mat对象中的值
		ri.at<float>(i, 0) = minr + i * rStep;
	}
	Mat r = repeat(ri, 1, size.width);//矩阵平铺
    //构建theta
	Mat thetaj = Mat::zeros(Size(size.width, 1), CV_32FC1);
	for (int j = 0; j < size.width; j++)
	{
		thetaj.at<float>(0, j) = mintheta + j * thetaStep;
	}
	Mat theta = repeat(thetaj, size.height, 1);//矩阵平铺
	//极坐标转换为笛卡尔坐标
	Mat x, y;
	polarToCart(r, theta, x, y, true);
	//将坐标原点移动到中心点
	x += center.x;
	y += center.y;
	//最近邻插值
	Mat dst = 125 * Mat::ones(size, CV_8UC1);
	for (int i = 0; i < size.height; i++)
	{
		for (int j = 0; j < size.width; j++)
		{
			float xij = x.at<float>(i, j);
			float yij = y.at<float>(i, j);
			int nearestx = int(round(xij));
			int nearesty = int(round(yij));
			if ((0 <= nearestx && nearestx < I.cols) &&
				(0 <= nearesty && nearesty < I.rows))
				dst.at<uchar>(i, j) = I.at<uchar>(nearesty, nearestx);
		}
	}
	return dst;
}

int main()
{
	//读入图像
	Mat I = imread("C://Users//lsh//Desktop//OpenCV算法精解-测试图片//第3章//img2.jpg", IMREAD_GRAYSCALE);
	if (!I.data)
		return -1;
	//图像的极坐标变换
	float thetaStep = 1.0 / 4;
	float minr = 270;
	Size size(int(360 / thetaStep), 70);
	Mat dst = polar(I, Point2f(508, 503), size, minr);
	//沿水平方向上镜像处理
	flip(dst, dst, 0);
	//显示原图和变换后的结果
	imshow("I", I);
	imshow("极坐标变换", dst);
	waitKey(0);
	return 0;
}

  • I输入图像
  • center:坐标变换中心
  • minr:变换中心的最小距离
  • mintheta:最小角度
  • thetaStep:角度的变换步长
  • rStep:距离的变换步长
  • 插值:最邻近插值法
  • 利用函数flip(src,dst,flipCode)实现矩阵水平镜像、垂直镜像、逆时针旋转180°
    – src:输入图像矩阵
    – dst:输出图像矩阵
    – flipCode:>0:绕y轴镜像处理;=0:绕x轴镜像处理;<0:逆时针旋转180°

你可能感兴趣的:(opencv,计算机视觉,人工智能)