【openCV学习】18.仿射变换

1.什么是仿射变换

仿射变换是一个图像经过跟一个矩阵M进行运算,可以达到放大缩小平移旋转等效果的目的

放射变换的核心是找到变换矩阵,openCV中有提供变换矩阵的接口

2.利用仿射变换进行平移

平移操作比较简单,我们可以人为计算出变换矩阵

其中[[1,0,tx],[0,1,ty]]是变换矩阵,tx为在x轴方向移动的距离,ty为在y轴移动的距离,我们只需要将tx和ty改成我们想要的大小,就可得到平移矩阵。

比如下面是将图像向左平移100像素的代码:

import cv2

import numpy as np

dog = cv2.imread("image/dog.png")

h,w,ch = dog.shape

#平移矩阵

M = np.float32([[1,0,100],[0,1,0]])

new =  cv2.warpAffine(dog,M,(w,h))

cv2.imshow('show',new)

cv2.waitKey(0)

cv2.destroyAllWindows()

运行结果如下图所示:

3.获取变换矩阵的三种方式

当需要图片进行旋转,缩放等比较复杂的操作时,人为计算变换矩阵就比较麻烦,因此openCV提供了三种获取变换矩阵的接口。

getRotationMatrix2D(center,angle,scale)

例子:

#center中心点,以图片哪个点作为旋转的中心

#angle 加偶的,旋转的角度,按照逆时针旋转

#scale 缩放比例

#注意openCV一切都是先宽后高,而不是熟悉的先高后宽

M = cv2.getRotationMatrix2D((w/2,h/2),15,1.0)

new_dog = cv2.warpAffine(dog,M,(w,h))

getAffineTransform(src,dst)

例子

"""通过三点自动计算变换矩阵的API"""

#getAffineTransform(src,dst)

#src为原图中的三点坐标,dst为变换之后的图片对应的三点的坐标

#该函数会根据三点坐标之间的移动,自动计算出变换矩阵

src = np.float32([[50,100],[80,100],[200,300]])

dst = np.float32([[100,150],[360,200],[280,120]])

M2 = cv2.getAffineTransform(src,dst)

new_dog2 = cv2.warpAffine(dog,M2,(w,h))

透视变换getPerspectiveTransform(src,dst)

#通过原图和之后图对应的四个点的坐标来获得原始矩阵

#应用场景比如将倾斜的图片摆正

#getPerspectiveTransform(src,dst)

第三种透视变换与第二种的区别只是第二种需要三个点的坐标,而第三种需要四个点的坐标

4.完整代码:

import cv2
import numpy as np

dog = cv2.imread("image/dog.png")

h,w,ch = dog.shape

"""获取变换矩阵的API"""
#getRotationMatrix2D(center,angle,scale)
#center中心点,以图片哪个点作为旋转的中心
#angle 加偶的,旋转的角度,按照逆时针旋转
#scale 缩放比例
#注意openCV一切都是先宽后高,而不是熟悉的先高后宽
M = cv2.getRotationMatrix2D((w/2,h/2),15,1.0)
new_dog = cv2.warpAffine(dog,M,(w,h))

"""通过三点自动计算变换矩阵的API"""
#getAffineTransform(src,dst)
#src为原图中的三点坐标,dst为变换之后的图片对应的三点的坐标
#该函数会根据三点坐标之间的移动,自动计算出变换矩阵
src = np.float32([[50,100],[80,100],[200,300]])
dst = np.float32([[100,150],[360,200],[280,120]])
M2 = cv2.getAffineTransform(src,dst)
new_dog2 = cv2.warpAffine(dog,M2,(w,h))

"""透视变换"""
#通过原图和之后图对应的四个点的坐标来获得原始矩阵
#应用场景比如将倾斜的图片摆正
#getPerspectiveTransform(src,dst)

cv2.imshow("show",new_dog)
cv2.imshow("show2",new_dog2)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

owooooow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值