Similarity Transform
平移旋转
公式如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191017112442157.png
getRotationMatrix2D函数
**主要用于获取图像环绕某一点的旋转矩阵
函数调用形式:
Mat getRotationMatrix2D(Point2f center, double angle, double scale)
参数详解:
Point2f center:表示旋转的中心点
double angle:表示旋转的角度
double scale:图像缩放因子
warpAffine函数
对图像实现仿射变换
void cv::warpAffine ( InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar()
)
参数解释
. src: 输入图像
. dst: 输出图像,尺寸由dsize指定,图像类型与原图像一致
. M: 2X3的变换矩阵
. dsize: 指定图像输出尺寸
. flags: 插值算法标识符,有默认值INTER_LINEAR,如果插值算法为WARP_INVERSE_MAP, warpAffine函数使用如下矩阵进行图像转换
程序
def similarity_transform(point,angle,scale,ig):
M = cv2.getRotationMatrix2D(point,angle,scale)
img_rotate = cv2.warpAffine(img,M, (img.shape[1],img.shape[0]))
return img_rotate
img = cv2.imread("lenna.jpg",1)
cv2.imshow("initial",img)
img_rotate = similarity_transform((img.shape[1]//2,img.shape[0]//2),30,0.5,img)
cv2.imshow("ROtate",img_rotate)
旋转前的图片
旋转后的图片
Affine Transform
将矩形的图像变换为其他的规则图像譬如平行四边形
公式如下:
程序:
def affine_transform(img):
cols = img.shape[1]
rows = img.shape[0]
pst1 = np.float32([[0,0],[cols-1,0],[0,rows-1]])
pst2 = np.float32([[cols * 0.2, rows * 0.1],[cols * 0.9, rows * 0.2], [cols*0.2, rows*0.9]])
M = cv2.getAffineTransform(pst1,pst2)
dst = cv2.warpAffine(img, M , (cols,rows))
return dst
img = cv2.imread("lenna.jpg",1)
cv2.imshow("initial",img)
img_affine = affine_transform(img)
cv2.imshow("Affine", img_affine)
原图:
进行仿射变换后的图像:
Perspective Transform
有两项注意点。
8个自由度(即四对点)
在计算时, p的行列式为1
程序
def perspective_transfoem(img):
pst1 = np.float32([[514,357],[708,365],[737,568],[505,556]])
pst2 = np.float32([[0,0],[300,0],[300,300],[0,300]])
M = cv2.getPerspectiveTransform(pst1,pst2)
img_per = cv2.warpPerspective(img, M,(301,301))
return img_per
img = cv2.imread("1.jpg",1)
cv2.imshow("initial",img)
img_per = perspective_transfoem(img)
cv2.imshow("perspective",img_per)
原图:
投影变换后的图像
总结
三种变换的区别是前两种是平面上进行变换,最后一种是空间上进行变换。