几何变换-缩放、旋转
1 缩放
1.1 缩放矩阵
图像的缩放主要用于改变图像的大小,图像在缩放后高度和宽度都可能发生变化。水平缩放系数是指水平方向上的缩放比例,表示水平方向上被拉伸,表示水平方向被压缩。同理,垂直缩放系数是指垂直方向上的缩放比例,表示垂直方向上被拉伸,表示垂直方向上被压缩。
1.2 OpenCV实现
注意,调用cv::warpAffine
时需要加上cv::WARP_INVERSE_MAP
标志表示输入的变换矩阵是反变换矩阵,即是向后映射矩阵。
//创建图像缩放矩阵
void CreateScaleMatrix(float fScaleX, float fScaleY, cv::Mat& mat)
{
mat = cv::Mat::zeros(2, 3, CV_32F);
mat.at<float>(0, 0) = 1/fScaleX;
mat.at<float>(0, 1) = 0;
mat.at<float>(1, 0) = 0;
mat.at<float>(1, 1) =1/ fScaleY;
}
//调用方法
cv::Mat mat_scale;
float fsx =2;
float fsy = 2;
CreateScaleMatrix(fsx, fsy, mat_scale);
cv::Mat res_scale;
cv::warpAffine(srcimg, res_scale, mat_scale, cv::Size(srcimg.cols*fsx,srcimg.rows*fsy ), cv::INTER_LINEAR | cv::WARP_INVERSE_MAP);
cv::imshow("res_scale", res_scale);
OpenCV中,还可以使用cv::resize
进行图像的缩放。
1.3 Matlab实现
Matlab中使用imresize
函数进行图像缩放。
2 旋转
2.1 OpenCV实现
OpenCV中,通过cv::getRotationMatrix2D
能够实现计算绕中心点center,旋转特定角度,并同时进行缩放的仿射矩阵。
cv::Point2f center(srcimg.rows / 2, srcimg.cols / 2);
float fAngle = 30;
cv::Mat mat_rotate = cv::getRotationMatrix2D(center, fAngle, 1);
cv::Mat res_rotate;
cv::warpAffine(srcimg, res_rotate, mat_rotate, srcimg.size(), cv::INTER_LINEAR | cv::WARP_INVERSE_MAP);
cv::imshow("res_rotate", res_rotate);