4.2.1 仿射变换
4.2.1 仿射变换
仿射变换(affine transformation)是空间直角坐标系的变换,从一个二维坐标变换到另一个二维坐标,如图4-5所示。仿射变换是一个线性变换,它保持了图像的“平行性”和“平直性”,即图像中原来的直线和平行线,变换后仍然保持原来的直线和平行线。仿射变换比较常用的变换有缩放、旋转、平移、剪切和翻转。
图4-5 仿射变换示意图
假设某点变换前的坐标为(x,y),变换后的坐标为(x',y'),那么仿射变换可以表示为:
opencv支持仿射变换,读者可以通过warpaffine函数对图像进行指定的变化。
warpaffine(src, m, dsize, flags, bordermode, bordervalue)
其中主要参数的含义如下:
? src:输入变换前图像。
? m:仿射变换矩阵。
? dsize:设置输出图像大小。
? flags:设置插值方式,默认方式为线性插值。
? bordermode:边界像素模式。
? bordervalue:边界填充值,默认情况下为0,即填充黑色。
直接填写仿射变换矩阵不是很直观,opencv还提供了getrotationmatrix2d函数用于生成变换矩阵,函数定义如下:
getrotationmatrix2d(center, angle, scale)
其中主要参数的含义如下:
? center:表示旋转的中心点。
? angle:表示旋转的角度。
? scale:表示图像缩放系数。
下面我们结合实际例子介绍仿射变换。为了突显出图像变化前后的差别,我们会使用matplotlib进行子窗口绘图。在matplotlib中,使用subplot函数可以方便地设置窗口的个数、窗口的排列顺序等。
如图4-6所示,我们希望水平排列三个子窗口,plt.subplot(131)表示一共一行窗口,一行排列三个窗口,在第一个窗口中绘图;plt.subplot(132)表示一共一行窗口,一行排列三个窗口,在第二个窗口中绘图。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img=cv2.imread("../picture/pig.jpg")
img1 = cv2.cvtcolor(img, cv2.color_bgr2rgb)
rows,cols,_ = img.shape
plt.subplot(131)
plt.imshow(img1)
plt.subplot(132)
plt.imshow(img1)
plt.subplot(133)
plt.imshow(img1)
图4-6 matplotlib使用举例
同理,如果我们希望垂直排列三个子窗口,plt.subplot(311)表示一共一列窗口,一列排列三个窗口,在第一个窗口中绘图;plt.subplot(312)表示一共一列窗口,一列排列三个窗口,在第二个窗口中绘图。
仿射变换(affine transformation)是空间直角坐标系的变换,从一个二维坐标变换到另一个二维坐标,如图4-5所示。仿射变换是一个线性变换,它保持了图像的“平行性”和“平直性”,即图像中原来的直线和平行线,变换后仍然保持原来的直线和平行线。仿射变换比较常用的变换有缩放、旋转、平移、剪切和翻转。
图4-5 仿射变换示意图
假设某点变换前的坐标为(x,y),变换后的坐标为(x',y'),那么仿射变换可以表示为:
opencv支持仿射变换,读者可以通过warpaffine函数对图像进行指定的变化。
warpaffine(src, m, dsize, flags, bordermode, bordervalue)
其中主要参数的含义如下:
? src:输入变换前图像。
? m:仿射变换矩阵。
? dsize:设置输出图像大小。
? flags:设置插值方式,默认方式为线性插值。
? bordermode:边界像素模式。
? bordervalue:边界填充值,默认情况下为0,即填充黑色。
直接填写仿射变换矩阵不是很直观,opencv还提供了getrotationmatrix2d函数用于生成变换矩阵,函数定义如下:
getrotationmatrix2d(center, angle, scale)
其中主要参数的含义如下:
? center:表示旋转的中心点。
? angle:表示旋转的角度。
? scale:表示图像缩放系数。
下面我们结合实际例子介绍仿射变换。为了突显出图像变化前后的差别,我们会使用matplotlib进行子窗口绘图。在matplotlib中,使用subplot函数可以方便地设置窗口的个数、窗口的排列顺序等。
如图4-6所示,我们希望水平排列三个子窗口,plt.subplot(131)表示一共一行窗口,一行排列三个窗口,在第一个窗口中绘图;plt.subplot(132)表示一共一行窗口,一行排列三个窗口,在第二个窗口中绘图。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img=cv2.imread("../picture/pig.jpg")
img1 = cv2.cvtcolor(img, cv2.color_bgr2rgb)
rows,cols,_ = img.shape
plt.subplot(131)
plt.imshow(img1)
plt.subplot(132)
plt.imshow(img1)
plt.subplot(133)
plt.imshow(img1)
图4-6 matplotlib使用举例
同理,如果我们希望垂直排列三个子窗口,plt.subplot(311)表示一共一列窗口,一列排列三个窗口,在第一个窗口中绘图;plt.subplot(312)表示一共一列窗口,一列排列三个窗口,在第二个窗口中绘图。