什么是仿射变换?
仿射变换是图像旋转、缩放、平移的总称
仿射变换API :
warpAffine(src,M,dsize,flags,mode,value)
src:源图像
M:变换矩阵
dsize 输出尺寸大小
flag:与resize中的插值算法一致(见上一篇文章)
mode:边界外推法标志
value:填充边界的值
1.图像的平移—平移矩阵
矩阵中的每个像素由(x,y)组成
图像的平移就是在(x,y)上加值
因为像素是由两个元素(x,y)组成,所以变换矩阵是2*2矩阵
平移向量为2*1的向量,所在平移矩阵为2*3矩阵
#仿射变换的核心就是变换矩阵
import cv2
import numpy as np
img = cv2.imread('C:\\Users\\Mengyang\\Desktop\\112.png')
M = np.float32([[1,0,100],[0,1,0]]) #创建一个2*2的单位矩阵,增加一个偏移量,向右横移100
h, w, ch = img.shape #获取图片的信息 高 宽 通道数
new = cv2.warpAffine(img,M,(w,h))
cv2.imshow('img',img)
cv2.imshow('new',new)
cv2.waitKey(0)
2.仿射变换之获取变换矩阵(一)
getRotationMatrix2D(center,angle,scale)
center 中心点
angle 旋转角度,逆时针
scale 缩放比例
#仿射变换的核心就是变换矩阵
import cv2
import numpy as np
img = cv2.imread('C:\\Users\\Mengyang\\Desktop\\112.png')
h, w, ch = img.shape #获取图片的信息 高y 宽x 通道数
#M = np.float32([[1,0,100],[0,1,0]]) #创建一个2*2的单位矩阵,增加一个偏移量,向右横移100
#通过API创建变换矩阵
#旋转的角度为逆时针,中心点是(x,y)
#M = cv2.getRotationMatrix2D((100,100),15,1.0) #中心点 旋转角度 缩放比例1.0
# 中心旋转
M = cv2.getRotationMatrix2D((w/2,h/2),15,0.5)
#如果想要改变新图像的尺寸,需要修改dsize
new = cv2.warpAffine(img,M,(int(w/2),int(h/2)))
#new = cv2.warpAffine(img,M,(w,h))
cv2.imshow('img',img)
cv2.imshow('new',new)
cv2.waitKey(0)
2.仿射变换之获取变换矩阵(二)
通过点来确定变换的位置,横着两点确定一条直线,竖着两点确定一条直线
getAffineTransform(src[], dst[])
src[] 原坐标点
dst[] 目标坐标点
通过三个点就可以确定变换的位置
#仿射变换的核心就是变换矩阵
import cv2
import numpy as np
img = cv2.imread('C:\\Users\\Mengyang\\Desktop\\112.png')
h, w, ch = img.shape #获取图片的信息 高y 宽x 通道数
#M = np.float32([[1,0,100],[0,1,0]]) #创建一个2*2的单位矩阵,增加一个偏移量,向右横移100,创建变换矩阵
#通过API创建变换矩阵
#旋转的角度为逆时针,中心点是(x,y)
#M = cv2.getRotationMatrix2D((100,100),15,1.0) #中心点 旋转角度 缩放比例1.0
#M = cv2.getRotationMatrix2D((w/2,h/2),15,0.5) # 中心旋转
src = np.float32([[10,20],[100,100],[200,300]]) #选择3个点,注意这三个点一定要在原图上
dst = np.float32([[60,20],[150,100],[250,300]]) #目标点,横坐标右移50
#获取变换矩阵方法2
M = cv2.getAffineTransform(src, dst)
#如果想要改变新图像的尺寸,需要修改dsize
#new = cv2.warpAffine(img,M,(int(w/2),int(h/2)))
new = cv2.warpAffine(img,M,(w,h))
cv2.imshow('img',img)
cv2.imshow('new',new)
cv2.waitKey(0)