图像空间几何变换

参考

https://www.cnblogs.com/wj-1314/p/12166917.html

差值原理

  • 后向映射后得到的坐标如果是浮点数,这有
    1. 直接四舍五入取整数坐标,再从原图取值 , 最邻近差值
    2. 线性差值应用两次,距离那边近权值越大,即点到边界的距离反比, 双线性差值

矩阵相乘原理

  • 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()

霍夫变换

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
  • 结果
posted @ 2021-04-09 15:54  boyang987  阅读(121)  评论(0编辑  收藏  举报