warpAffine是一個不能忽略的東西,之前大意認爲是很簡單的東西,然而實際用起來還是需要掌握基本的數學思想的。
重點是一個2*3的平移矩陣M,分別指定x方向和y方向上的平移量tx和ty,平移矩陣的形式如下:
python:
import numpy as np
import cv2
img=cv2.imread("lena.png")
#平移矩陣[[1,0,-100],[0,1,-12]]
M=np.array([[1,0,-100],[0,1,-12]],dtype=np.float32)
img_change=cv2.warpAffine(img,M,(300,300))
cv2.imshow("test",img_change)
cv2.waitKey(0)
import numpy as np
import cv2
img = cv2.imread(r"00000.png")
# 對圖像進行變換(三點得到一個變換矩陣)
# 我們知道三點確定一個平面,我們也可以通過確定三個點的關係來得到轉換矩陣
# 然後再通過warpAffine來進行變換
cv2.imshow("original", img)
rows, cols = img.shape[:2]
# #平移矩陣[[1,0,-100],[0,1,-12]]
# M=np.array([[1.4,0,-100],[0,1.2,-12]],dtype=np.float32) #左移100, 上移12 水平拉伸1.4 垂直拉伸1.2
a=np.random.randint(-2,2) #水平
b=np.random.randint(-2,2) #垂直
c=np.random.uniform(1,1) #水平拉伸
d=np.random.uniform(1,1.2) #垂直拉伸
print(a)
print(b)
print(c)
print(d)
M=np.array([[c,0,a],[0,d,b]],dtype=np.float32) #左移100, 上移12
dst = cv2.warpAffine(img, M, (cols, rows), borderValue=(0, 0, 0))
cv2.imshow("res", dst)
cv2.waitKey(0)
c++:
cv::Mat src = cv::imread("lenna.jpg");
cv::Mat dst;
cv::Size dst_sz = src.size();
//定義平移矩陣
cv::Mat t_mat =cv::Mat::zeros(2, 3, CV_32FC1);
t_mat.at<float>(0, 0) = 1;
t_mat.at<float>(0, 2) = -100; //水平平移量
t_mat.at<float>(1, 1) = 1;
t_mat.at<float>(1, 2) = 12; //豎直平移量
//根據平移矩陣進行仿射變換
cv::warpAffine(src, dst, t_mat, dst_sz);
//顯示平移效果
cv::imshow("image", src);
cv::imshow("result", dst);
cv::waitKey(0);
return 0;
借用一下圖:
2. 圖像的旋轉
圖像的旋轉具體實現分爲兩步:先根據旋轉角度和旋轉中心獲取旋轉矩陣(通常採用RotatedRect函數獲得);然後根據旋轉矩陣進行仿射變換,即可實現任意角度和任意中心的旋轉效果。旋轉矩陣的形式如下:
其中,
cv::Mat src = cv::imread("lenna.jpg");
cv::Mat dst;
//旋轉角度
double angle = 45;
cv::Size src_sz = src.size();
cv::Size dst_sz(src_sz.height, src_sz.width);
int len = std::max(src.cols, src.rows);
//指定旋轉中心
cv::Point2f center(len / 2., len / 2.);
//獲取旋轉矩陣(2x3矩陣)
cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
//根據旋轉矩陣進行仿射變換
cv::warpAffine(src, dst, rot_mat, dst_sz);
//顯示旋轉效果
cv::imshow("image", src);
cv::imshow("result", dst);
cv::waitKey(0);
return 0;
參考博客:https://blog.csdn.net/guduruyu/article/details/70799804