zoukankan      html  css  js  c++  java
  • opencv-python教程学习系列11-几何变换

    前言

    opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍几何变换,坚持学习,共同进步。

    系列教程参照OpenCV-Python中文教程

    系统环境

    系统:win7_x64;

    python版本:python3.5.2;

    opencv版本:opencv3.3.1;

    内容安排

    1.知识点介绍;

    2.测试代码;

    具体内容

    1.知识点介绍;

    主要涉及函数cv2.getPerspectiveTransform,cv2.warpAffine和cv2.warpPersperctive;

    1.1 缩放;

    缩放仅仅改变图像尺寸,opencv提供的函数cv2.resize()可以实现此功能。图片的尺寸可以指定尺寸大小,或者指定缩放因子。可以使用不同的插值运算方法,在缩放时推荐的插值运算方法是 cv2.INTER_AREA,在扩展时推荐使用v2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下改变图像大小的操作使用插值方法是cv2.INTER_LINEAR,可以使用任意一种方法改变图像尺寸。

    ##None为图像尺寸时,fx和fy参数是缩放因子
    res = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
    #or
    #这里直接设置输出图像的尺寸,所以不用设置缩放因子
    height, width =img.shape[:2]
    res = cv2.resize(img,(2*width, 2*height),interpolation=cv2.INTER_CUBIC)
    #注意,integer argument expected;那怎么缩小呢??
    

    1.2 平移;

    平移就是移动对象位置。如果你知道移动方向(x,y),移动距离是(tx,ty),可以创建如下矩阵。

    可以使用Numpy数组构建矩阵,数据类型是np.float32,然后将其传入函数cv2.warpAffine();
    函数cv2.warpAffine() 第三个参数是输出图像的大小,格式是图像的(宽,高)。
    注意,图像的宽对应的是列数,高对应的是行数。

    M = np.float32([[1,0,100], [0,1,50]])
    dst = cv2.warpAffine(img, M, (cols,rows))
    

    1.3 旋转;

    对一个图像旋转角度θ,旋转矩阵如下:

    在opencv中允许在任意地方进行旋转,旋转矩阵如下:

    其中,

    opencv提供了cv2.getRotationMatrix2D函数来实现旋转矩阵;

    M=cv2.getRotationMatrix2D((cols/2,rows/2), 45, 0.6)
    #第三个参数是输出图像的尺寸中心
    dst=cv2.warpAffine(img, M, (2*cols,2*rows))
    

    1.4 仿射变换;

    仿射变换中,原图中的平行线变换后依然平行。创建仿射变换矩阵需要在图像中找三个点和这三个点在输出图像的位置。使用cv2.getAffineTransform函数创建2*3的仿射变换矩阵,矩阵会被传递给cv2.warpAffine函数;

    pts1 = np.float32([[50,50],[200,50],[50,200]])
    pts2 = np.float32([[10,100],[200,50],[100,250]])
    #行,列,通道数
    M = cv2.getAffineTransform(pts1, pts2)
    dst = cv2.warpAffine(img, M, (cols,rows))
    

    1.5 透视变换;

    透视变换需要3*3的矩阵,透视变换后直线还是直线,建立透视矩阵需要在图像上找4个点,以及他们在输出图像上的对应位置,这四个点任意三个不能共线。由cv2.getPerspectiveTransform() 构建矩阵,然后将矩阵传递给cv2.warpPerspective函数;

    pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
    pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
    M = cv2.getPerspectiveTransform(pts1, pts2)
    dst = cv2.warpPerspective(img, M, (300,300))

    2.测试代码;

    2.1 缩放/旋转等;

    import cv2
    img = cv2.imread('test.jpg',0)
    rows,cols=img.shape
    #这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
    #可以通过设置旋转中心,缩放因子以及窗口大小来防止旋转后超出边界的问题。
    M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
    #第三个参数是输出图像的尺寸中心
    dst=cv2.warpAffine(img,M,(2*cols,2*rows))
    while(1):
        cv2.imshow('img',dst)
        if cv2.waitKey(1)==27:
            break
    cv2.destroyAllWindows()
    

    2.2 仿射/透视变换;

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img=cv2.imread('test.jpg')
    rows,cols,ch=img.shape
    
    pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
    pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
    M = cv2.getPerspectiveTransform(pts1, pts2)
    dst = cv2.warpPerspective(img, M, (300,300))
    
    plt.subplot(121), plt.imshow(img), plt.title('Input')
    plt.subplot(122), plt.imshow(dst), plt.title('output')
    plt.show()

    参考

    1.几何变换

    2.CSDN几何变换

  • 相关阅读:
    AVL树的java实现
    request和response的setCharacterEncoding()方法
    几种常用数据库连接池的使用
    String类、static关键字、Arrays类、Math类
    QT学习笔记(day02)
    QT学习笔记(day01)
    STL中栈和链表的不同实现方式的速度对比
    C++泛化双端队列
    C++泛化队列
    C++泛化栈
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/8127637.html
Copyright © 2011-2022 走看看