图像空间几何变换
参考
https://www.cnblogs.com/wj-1314/p/12166917.html
差值原理
- 后向映射后得到的坐标如果是浮点数,这有
- 直接四舍五入取整数坐标,再从原图取值 , 最邻近差值
- 线性差值应用两次,距离那边近权值越大,即点到边界的距离反比, 双线性差值
矩阵相乘原理
- A*B ,学校里面学线性代数,老师教的是A推倒后与B乘,比较难用 ,弃用
- 看了《Python 深度学习》一书,我总结出一个方便记忆的方法
示例:
图像旋转
- 熟练将平移 旋转等转换为矩阵连乘的形式
- 可以总结出最根本的问题,精简代码 提升程序效率
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 30, 1)
rotated = cv2.warpAffine(src, M, (cols, rows))
- getRotationMatrix2D得到如下矩阵乘法的结果,并计算Left和Top
- warpAffine 即应用如下规则 进行后向映射
图像透视变换
- 参考 https://www.cnblogs.com/liekkas0626/p/5262942.html
- 仿射变换(Affine Transformation)可以理解为透视变换的特殊形式
- 文中代码用C++实现
- 用Python Opencv进行研究
- 下图中绿色的圆圈是原图坐标,红圈是透视变换的目标,其中下面两个红圈超出图像范围没显示出来
- 这是透视变换的结果,可以看到上面两绿圈在透视图中对应的位置
- 透视变换完整python code
#原始图像及其透视变换
#url: https://www.cnblogs.com/liekkas0626/p/5262942.html
import cv2 # opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt # Matplotlib读取的格式是RGB
import time
import random
def test7():
#因为Python OpenCV是从C++扩展来的,坐标点统一是(x,y)方式
img = cv2.imread('load.png')
print(img.shape)
height,width,_= img.shape
pos1 = np.float32([[10, 457], [359, 291], [624, 291],[1000, 457]])
for row in range(pos1.shape[0]):
cv2.circle(img,(pos1[row,0],pos1[row,1]),10,(0,255,0),1)
pos2 = np.float32([[46, 920], [46, 100], [600, 100],[600, 920]])
for row in range(pos2.shape[0]):
cv2.circle(img,(pos2[row,0],pos2[row,1]),10,(0,0,255),1)
transform = cv2.getPerspectiveTransform(pos1,pos2)
imgPerspective= cv2.warpPerspective(img,transform,(width,height) )
cv2.imshow('img',img)
cv2.imshow('imgPerspective',imgPerspective)
cv2.waitKey(0)
if __name__ == "__main__":
test7()
霍夫变换
- 参考 https://www.cnblogs.com/ybqjymy/p/12826850.html
- 文中极坐标相关理论待研究,
- 用法实践
def test8():
img= cv2.imread('linetest.png')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edge= cv2.Canny(gray,100,200)
#maxLineGap最大间隔,有默认值0,允许将同一行点与点之间连接起来的最大的距离
#取边缘时,会造成有些点不连续,所以maxLineGap设大点
lines= cv2.HoughLinesP(edge, 1, np.pi/180, 10, minLineLength=10, maxLineGap=10)
#draw lines
res= np.zeros_like(img)
for i in range(lines.shape[0]):
cv2.line(res,tuple(lines[i,0,:2]),tuple(lines[i,0,2:]),(255,0,0),2)
cv2.imshow('res',res )
cv2.waitKey(0)
#lines.shape (66, 1, 4)
pass
- 结果