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

几何变换-缩放、旋转

1 缩放

1.1 缩放矩阵

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

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

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} [αββα(1α)center.xβcenter.yβcenter.x+(1α)center.y]

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

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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值