OpenCV进阶--图像变换(三)

继上文:

五、图像透视变换

        首先透视变换是按照物体成像投影规律进行变换,即将物体重新投影到新的成像平面。在透视变换中,透视前的图像和透视后的图像之间的变换关系可以用一个3*3的变换矩阵表示,该矩阵可以通过两幅图像中4个对应点的坐标求取,因此透视变换又称作“四点变换”。在OpenCV中提供了根据4个对应点求取变换矩阵的getPerspectiveTransform()函数和透视变换的warpPerspective()函数。

getPerspectiveTransform()函数原型:

Mat cv::getPerspectiveTransform(const Point2f src[],
                                const Point2f dst[],
                                int solveMethod = DECOMP_LU
                                )

src[]:原图像中的4个像素坐标。

dst[]:目标图像中的4个像素坐标。

solveMethod:选择计算透视变换矩阵方法的标志,可以选择的参数及含义在下表中给出。

getPerspectiveTransform()函数计算方法标志
标志参数简记作用
DECOMP_LU0最佳主轴元素的高斯消元法
DECOMP_SVD1奇异值分解(SVD)方法
DECOMP_EIG2特征值分解法
DECOMP_CHOLESKY3Cholesky分解法
DECOMP_QR4QR分解法
DECOMP_NORMAL16使用正规方程式,可以与其他的标志一起使用

warpPerspective()函数原型:

void cv::warpPerspective(InputArray src,
                         OutputArray dst,
                         InputArray M,
                         Size dsize,
                         int flags = INTER_LINEAR,
                         int borderMode = BORDER_CONSTANT,
                         const Scalar& borderValue = Scalar()
                         )

src:输入图像。

dst:透视变换后输出图像,与src数据类型相同,但是尺寸与dsize相同。

M:3*3的变换矩阵。

dsize:输出图像的尺寸。

flags:插值方法标志。

borderMode:像素边界外推方法的标志。

borderValue:填充边界使用的数值,默认情况下为0。

这个函数的参数含义与warpAffine()函数(在上文)的参数含义相同,不过多赘述。

六、极坐标变换

        极坐标变换就是将图像在直角坐标系与极坐标系中互相变换,可以将一个圆形的图像变成一个矩形图像,它常用语处理钟表、圆盘等图像。在OpenCV中提供了warpPolar()函数用于实现图像的极坐标变换,代码原型如下:

void cv::warpPolar(InputArray src,
                   OutputArray dst,
                   Size dsize,
                   Point2f center,
                   double maxRadius,
                   int flags
                   )

src:源图像。

dst:极坐标变换后输出图像,与源图像具有相同的数据类型和通道数。

dsize:目标图像大小。

center:极坐标变换时极坐标的原点坐标。

maxRadius:变换时边界圆的半径,它也决定了逆变换时的比例参数。

flags:插值方法与极坐标映射方法标志,两个方法之间通过“+”或者“|”号连接。

warpPolar()函数极坐标映射方法标志
标志参数作用
WARP_POLAR_LINEAR极坐标
WARP_POLAR_LOG半对数极坐标变换
WARP_INVERSE_MAP逆变换

代码实例:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>

using namespace std;
using namespace cv;

int main()
{	
	Mat img = imread("D:\\lena.jpg");
	if (img.empty())
	{
		cout << "请确认图像的文件名字是否正确" << endl;
		return -1;
	}

	Mat img1, img2;
	Point2f center = Point2f(img.cols / 2, img.rows / 2);      //极坐标在图像中的原点
	//正极坐标变换
	warpPolar(img, img1, Size(300, 600), center, center.x, INTER_LINEAR + WARP_POLAR_LINEAR);
	//逆极坐标变换
	warpPolar(img, img2, Size(img.rows, img.cols), center, center.x, INTER_LINEAR + WARP_POLAR_LINEAR + WARP_INVERSE_MAP);

	imshow("源图像", img);
	imshow("正极坐标变换", img1);
	imshow("逆极坐标变换", img2);
	waitKey(0);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值