opencv教程(基于python)----几何变换

几何变换的几个操作其实就是缩放,移动,旋转,放射变换。

先看缩放,主要函数是resize,形式为resize(img,(x,y),interpolation=)。img是原图像;第二个参数是缩放的规模,可以自定义;interpolation是变换方法,默认的是interpolation=CV2.INTER_LINEAR,此外还有CV2.INTER_NN,CV2.INTER_AREA像素关系重采样;还有CV2.INTER_CUBIC立方插值(速度最慢)。一般选择默认就好,具体的要求还是使用具体的参数。案例如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img=cv2.imread('C:/Users/dell/Desktop/cos.jpg')
res=cv2.resize(img,(100,100))
while(1):
    cv2.imshow('res',res)
    cv2.imshow('img',img)
    if cv2.waitKey(1)&0xFF==27:
        break
cv2.destroyAllWindows()
这里是把图像缩放成100X100的规模,那时图像也已经不成样子了。


图像平移的函数是cv2.warpAffine,主要的参数有cv2.warpAffine(img,M,(rows,cols))第一个参数是原图像,M是位移矩阵,第三个参数是输出图像的规模。解释一下M矩阵


tx是行的位移,ty是列的位移。还是走一波代码。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img=cv2.imread('C:/Users/dell/Desktop/cos.jpg')
rows,cols,channel=img.shape
M=np.float32([[1,0,100],[0,1,50]])
dst=cv2.warpAffine(img,M,(rows,cols))
cv2.imshow('image',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()


下一个是旋转了,主要的函数是cv2.getRotionMatrix2D,主要形式为cv2.getRotionMatrix2D(center,angle,scale),第一个参数是旋转因子,最后一个参数是放缩的规模。最后在结合平移函数实现。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img=cv2.imread('C:/Users/dell/Desktop/cos.jpg')
rows,cols,channel=img.shape
M=cv2.getRotationMatrix2D((rows/2,cols/2),45,0.4)
dst=cv2.warpAffine(img,M,(rows,cols))
cv2.imshow('image',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()


仿射变换要求原图的平行线在输出图像中同样平行,这样至少需要原图和输出图像的三个来创建旋转矩阵,这种操作是比较精细化的。关键的函数是getAffineMatrix,她可以根据那六个点创建一个旋转矩阵。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img=cv2.imread('C:/Users/dell/Desktop/cos.jpg')
rows,cols,channel=img.shape
#原图的三个点
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,(rows,cols))
plt.subplot(1,2,1)
plt.imshow(img)
plt.title('input')
plt.subplot(1,2,2)
plt.imshow(dst)
plt.title('output')
plt.show()

颜色是信道问题一起的不必太在意。


最后一个是投影变换,和仿射变换的形式差不多,不过投影变幻是主要四个点(任意三个点不能是一条直线),我记得某手机的拍照功能有把你拍的PPT完全去掉边边角角,想来原理差不多是类似的,只不过这里咱们要自己找坐标。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img=cv2.imread('C:/Users/dell/Desktop/cos.jpg')
rows,cols,channel=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,(rows,cols))
plt.subplot(1,2,1)
plt.imshow(img)
plt.title('input')
plt.subplot(1,2,2)
plt.imshow(dst)
plt.title('output')
plt.show()
好了,今天就到这里了,明天开始的是图象阈值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值