【圖像處理】-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);

在這裏插入圖片描述

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