• python-图像处理(映射变换)


    做计算机视觉方向,除了流行的各种深度学习算法,很多时候也要会基础的图像处理方法。

    记录下opencv的一些操作(图像映射变换),日后可以方便使用

    先上一张效果图

    图二和图三是同一种方法,只是变换矩阵不同,都是3点映射变换

    图四使用的是4点映射变换

    --------------------------------------------------------------------------------------------------------------------------------------------------

    简单介绍下原理

    图像都知道是3维(通道)的矩阵,前两维就是由1字节(0-255)数字填充的二维数组。数字大小代表颜色的深浅。

    我们把变换前的原图作为x和y。变换后的图为u和v。将[x,y,1]乘上变换矩阵就可以得到对应的新的u和v。不同的变换矩阵有不同的作用(不同的变换方式)

    -------------------------------------------------------------------------------------------------------------------------------------------------

    所以现在就是求不同变换对应的不同的变换矩阵的过程

    求这个矩阵 在opencv中直接就有方法 

    只需提供原图的三个点和你要变换之后的三个点的映射位置(3个原图点,3个映射点)就可以求出这个变换矩阵

             

    当然了  你会发现不管怎么调整映射点 都不能任意变换

    因为只给三个点时 变换之后的图其实只是原图的等比缩放,并不能做到随意映射的效果

    这里opencv也提供了 四个点和四个映射的方法 求出对应的变换矩阵 ,最终得到任意映射的效果

    代码如下:

     1 # coding=gbk
     2 import cv2
     3 import numpy as np
     4 import matplotlib.pyplot as plt
     5 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
     6 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
     7 
     8 img=cv2.imread(r"test6.jpg")
     9 img = img[:,:,[2,1,0]]
    10 cols,rows,ch=img.shape
    11 
    12 pts1 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])                                 #三点映射
    13 pts2 = np.float32([[0, 0], [cols - 1, 0], [80, rows - 1]])
    14 pts21 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])
    15 pts22 = np.float32([[cols * 0.2, rows * 0.1], [cols * 0.9, rows * 0.2], [cols * 0.1, rows * 0.9]])
    16 pts31 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1],[cols - 1,rows-1]])              #四点映射
    17 pts32 = np.float32([[0, 0], [cols - 1, 0], [50, rows - 1],[cols - 50,rows-50]])
    18 
    19 M = cv2.getAffineTransform(pts1,pts2)                                                     #求三点映射的变换矩阵
    20 M2= cv2.getAffineTransform(pts21,pts22)
    21 M3 = cv2.getPerspectiveTransform(pts31,pts32)                                             #求四点映射的变换矩阵
    22 
    23 dst = cv2.warpAffine(img,M,(rows+120,cols))                                               #三点映射的变换函数
    24 dst2 = cv2.warpAffine(img,M2,(rows,cols))                                               
    25 dst3 = cv2.warpPerspective(img,M3,(rows+40,cols+50))                                      #四点映射的变换函数
    26 
    27 plt.subplot(221)
    28 plt.imshow(img)
    29 plt.title("原图")
    30 plt.subplot(222)
    31 plt.imshow(dst)
    32 plt.title("投影变换")
    33 plt.subplot(223)
    34 plt.imshow(dst2)
    35 plt.title("仿射原图变换")
    36 plt.subplot(224)
    37 plt.imshow(dst3)
    38 plt.title("仿射不规则变换")
    39 
    40 plt.show()
  • 相关阅读:
    java高级程序设计(第十周)
    java高级程序设计(第五周)
    java高级程序设计(第四周)
    期末设计(第十四周)
    期末设计(第十三周)
    期末设计(计划进度表)
    Java学习笔记(六)
    Java学习笔记(六)
    Java学习笔记(五)
    Java学习笔记(四)
  • 原文地址:https://www.cnblogs.com/bob-jianfeng/p/10574401.html
Copyright © 2020-2023  润新知