幾何變換-縮放、旋轉
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);