【图像处理】-008 几何变换-缩放、旋转

几何变换-缩放、旋转

1 缩放

1.1 缩放矩阵

  图像的缩放主要用于改变图像的大小,图像在缩放后高度和宽度都可能发生变化。水平缩放系数是指水平方向上的缩放比例sxs_x,sx>1s_{x}>1表示水平方向上被拉伸,sx<1s_{x}<1表示水平方向被压缩。同理,垂直缩放系数是指垂直方向上的缩放比例sys_{y},sy>1s_{y}>1表示垂直方向上被拉伸,sy<1s_{y}<1表示垂直方向上被压缩。

[x0 y0 1]=[x y 1][1/sx0001/sy0001][x_0 \space y_0 \space 1]=[x \space y \space 1]\begin{bmatrix} 1/s_{x}&0&0\\ 0&1/s_{y}&0\\ 0&0&1\\ \end{bmatrix}

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,旋转特定角度,并同时进行缩放的仿射矩阵。
[αβ(1α)center.xβcenter.yβαβcenter.x+(1α)center.y]\begin{bmatrix} \alpha &amp; \beta &amp; (1- \alpha ) \cdot \texttt{center.x} - \beta \cdot \texttt{center.y} \\ - \beta &amp; \alpha &amp; \beta \cdot \texttt{center.x} + (1- \alpha ) \cdot \texttt{center.y} \end{bmatrix}

α=scalecosangle,β=scalesinangle\begin{array}{l} \alpha = \texttt{scale} \cdot \cos \texttt{angle} , \\ \beta = \texttt{scale} \cdot \sin \texttt{angle} \end{array}

	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);

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章