赞
踩
仿射变换可以说是图像处理当中应用的比较多的一种变换了,在一些场合拍摄的图像有些时候会因为各种原因可能不能很好地对齐,所以这个时候可以用仿射变换完成图像的校正。
仿射变换在图形中的变换包括:平移、缩放、旋转、斜切及它们的组合形式,简单的来说,仿射变换实质就是一幅图像进行一个线性变换加上一次平移操作。
如果把图像细分到每个点,那么对应的每个点的仿射变换实质其实就是对这个点乘以仿射变换矩阵:
可以化简为:
有矩阵论或者线性代数基础的同学应该就能够发现,这里的仿射变换矩阵实质上就是一个2*3的2行3列矩阵,也就是说,只需要三个点就可以算出仿射变换矩阵
仿射变换矩阵的求解在程序上可以简单地通过opencv的
getAffineTransform函数实现
图片的校正对齐可以再求出变换矩阵之后通过
warpAffine函数实现
这里简单的介绍一下这两个函数:
M=cv2.GetAffineTransform(src, dst)
src为原始图像(即待校准图像)三个点的坐标。dst为标准图的对应三个点的坐标,返回值即为仿射矩阵(数组类型为numpy类型)
cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
功能为根据输入的图像、仿射变换矩阵对图片进行仿射变换,得到的即为我们想要的结果图片
输入参数为:
src - 输入图像。
M - 变换矩阵。
dsize - 输出图像的大小。
flags - 插值方法的组合(int 类型)
borderMode - 边界像素模式(int 类型)
borderValue -边界填充值; 默认情况下为0。
举例说明:
这张就是没有对齐的图片,下面通过刚才说的仿射变换将图片进行对齐,
这里找对齐的三个点可以是图像上三个角落的点,如红圈所示,当然也可以是其他位置的点,但是注意要和标准图对齐。
代码:
import cv2 import numpy as np images_path="2.jpg" img=cv2.imread(images_path) rows=img.shape[0] cols=img.shape[1] pts1 = np.float32([[239,76], [1079,151], [119,673]]) pts2 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]]) M = cv2.getAffineTransform(pts1, pts2) print(M) dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('image', dst) k = cv2.waitKey(0) if k == ord('w'): cv2.imwrite('3.jpg', dst) cv2.destroyAllWindows()
可以看到打印出来的仿射变换矩阵:
[[ 1.40104607e+00 2.81617301e-01 -3.56252927e+02]
[-1.09896568e-01 1.23084156e+00 -6.72786789e+01]]
对齐后的图片:
上图就是对齐结果了,可以看出效果其实还是非常理想的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。