opencv 几何变换之仿射变换
程序员文章站
2023-12-25 17:39:21
...
仿射变换可以用来平移图像:
进行仿射变换的图像与原图像相比,保持其平直性和平行性。
dst = cv2.warpAffine(src, m, dsize, flags, borderMode, bordervalue)
参数说明:
- src:原图
- dst:结果图像
- m:变换矩阵(2*3的矩阵)[[1, 0, dx],[0, 1, dy]]
- disze:窗口尺寸 (宽(列),高(行))
- flags:插值方式
- borderMode:边类型。
- bordervalue:边界值,默认0
# 平移 构建平移矩阵
import cv2 as cv
import numpy as np
img = cv.imread("picture\lena.jpg")
h, w = img.shape[:2]
# 移动的距离
x = 50
y = 50
# 构建矩阵 float32型 2*3的矩阵
m = np.float32([[1, 0, x], [0, 1, y]])
# 仿射变换进行图像平移 原图像 平移矩阵 dsize尺寸(窗口的尺寸)
dst = cv.warpAffine(img, m, (w, h))
cv.imshow('demo', dst)
cv.waitKey()
cv.destroyAllWindows()
复杂的仿射变换:可以进行平移 旋转等,由函数cv2.getAffineTransform()获取转换矩阵。
m = cv2.getAffineTransform(src, src1):
src:原图像的三个点坐标.(左上角,右上角,左下角)
src1:结果图像的对应的三个点坐标。
m:转换矩阵
注意:生成三个点的坐标矩阵时用np.float32(一个包括三个点坐标的二维数组)。
# 仿射变换中原图像平行的线,变换后也要平行。转换矩阵由函数获得。
import cv2 as cv
import numpy as np
img = cv.imread("picture\\timg.jpg")
rows, cols = img.shape[:2]
plt1 = np.float32([[50, 50],[150, 50],[50, 150]])
plt2 = np.float32([[100, 100],[200, 100],[100, 200]])
m = cv.getAffineTransform(plt1, plt2)
dst = cv.warpAffine(img, m, (cols, rows))
cv.imshow('demo', img)
cv.imshow('demo2', dst)
cv.waitKey()
cv.destroyAllWindows()