半树的opencvDay2

图形的几何变换

1.变换形式:
1.1放射变换
1.1.1 将遇到的问题
(1)变换公式
在这里插入图片描述
详情可见——一些常见的变换矩阵+作用
(2)旋转中心
缩放、平移可以以图像坐标原点(图像左上角为原点)为中心变换,无需坐标系变换,直接按照一般形式计算即可。
旋转和偏移,一般是以图像中心为原点,即涉及坐标系转换。
在这里插入图片描述
如上图——图像坐标的原点在图像左上角,水平向右为 X 轴,垂直向下为 Y 轴。常见的数学坐标系是以图像中心为原点,水平向右为 X 轴,垂直向上为 Y 轴,称为笛卡尔坐标系。

因此,对于旋转和偏移,就需要3步(3次变换):
1.将输入原图图像坐标转换为笛卡尔坐标系;
2.进行旋转计算。旋转矩阵前面已经给出了;
3.将旋转后的图像的笛卡尔坐标转回图像坐标。

3.冈萨雷斯的数字图像处理第三版中推荐使用反向映射:扫描输出图像的位置(x,y),通过[v , w , 1]=[x, y, 1]* T{{-1}}(T{{-1}}为T的逆矩阵)计算输入图像对应的位置 (v,w),通过插值方法决定输出图像该位置的灰度值。
4.最后,插值算法常用的是双线性插值(opencv默认),其他可选:最近邻插值、双线性插值,双三次插值
1.2.1 旋转变换
opencv中两个转换函数cv.warpAffinecv.warpPerspective可以用来对image进行平移、旋转、仿射变换。
python 代码实现

import cv2
import numpy as np

from matplotlib import pyplot as plt

img = cv2.imread('imagesFor_try3.png',1) # 读取图像
rows,cols,channel = img.shape

M = cv2.getRotationMatrix2D((cols/2,rows/3),90,0.4)
dst = cv2.warpAffine(img,M,(cols,rows))
plt.imshow(dst)

cv.warpAffine采用2x3转换矩阵,而cv.warpPerspective采用3x3转换矩阵作为输入。

1.2.2缩放
就是对img的大小进行调整,可用函数cv.resize()

首选的插值方法是cv.INTER_AREA用于缩小,cv.INTER_CUBIC(慢)和cv.INTER_LINEAR用于缩放。默认情况下,出于所有调整大小的目的,使用的插值方法为cv.INTER_LINEAR
python 代码实现

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('imagesFor_try3.png') # 读取图像
res1 = cv2.resize(img,None,fx=2,fy=2,interpolation = cv2.INTER_CUBIC)
plt.imshow(img)
plt.figure()
plt.imshow(res1)

图片上传不了(哼╭(╯^╰)╮)
具体可见Day1
1.2.3平移
应用到的函数是cv2.warpAffine(),其第三个参数是输出图像的大小,第二个是变换矩阵。
python 代码实现

import cv2
import numpy as np

from matplotlib import pyplot as plt

img = cv2.imread('imagesFor_try3.png',1) # 读取图像
rows,cols,channel = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))
plt.imshow(dst)

1.2.4仿射变换
仿射变换是一种二维坐标到二维坐标之间的线性变换,并保持二维图形的“平直性”。转换前平行的线,在转换后依然平行。
2.python实现

import cv2
import numpy as np

from matplotlib import pyplot as plt

img = cv2.imread('imagesFor_try3.png',1) # 读取图像
rows,cols,channel = img.shape


pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])

M = cv2.getRotationMatrix2D(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))
plt.subplot(121)
plt.imshow(img)
plt.title('Input')

plt.subplot(122)
plt.imshow(dst)
plt.title('Output')

2.1 附C++实现旋转,平移,缩放,偏移,组合变换链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值