图形的几何变换
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.warpAffine和cv.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')