OpenCV学习笔记9-几何变换

来源:互联网 发布:淘宝店开店流程2016 编辑:程序博客网 时间:2024/06/05 12:43

图像几何变换(移动,旋转,仿射变换等)。OpenCV提供了两个变换函数,使用这两个函数可以实现所有类型的变换:

1.cv2.warpAffine() #输入:2x3的变换矩阵
2.cv2.warpPerspective() #输入:3x3的变换矩阵

1.图像缩放

OpenCV提供函数cv2.resize()来实现图片的缩放功能。可以手动设置缩放的图片大小,或者给定一个缩放的因子,同时可以选用不同的插值方法。

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst

  • src是原图像;
  • dsize是缩放后的图像大小,若指定比例,dsize可取None;
  • dst是输出图像;
  • fx是x方向的缩放比例;
  • fy是y方向的缩放比例;
  • interpolation是插值的方式:
    cv2.INTER_AREA (默认):最近邻插值;
    cv2.INTER_LINEAR:双线性插值;
    cv2.INTER_CUBIC :三次立方插值。

import cv2import numpy as npimg = cv2.imread('1.png')img1 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_AREA)img2 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)img3 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)cv2.imshow('img',img)cv2.imshow('img1',img1)cv2.imshow('img2',img2)cv2.imshow('img3',img3)cv2.waitKey(0)cv2.destroyAllWindows()

2.图像平移

如果已知图像在x、y方向上的位移,则可以生成如下的变换矩阵:

这里写图片描述

矩阵用一个Numpy的float32的array表示,然后将矩阵作为参数,传给cv2.warpAffine()。


import cv2import numpy as npimg = cv2.imread('1.png')rows, cols, channels = img.shapeM = np.float32([[1,0,20], [0,1,50]])  #沿x方向平移20,沿y方向平移50dst = cv2.warpAffine(img, M, (rows, cols))cv2.imshow('img', img)cv2.imshow('dst', dst)cv2.waitKey(0)cv2.destroyAllWindows()

3.图像旋转

cv2.getRotationMatrix2D(center, angle, scale) -> retval

  • center为旋转中心坐标;
  • angle为旋转角度;
  • scale是缩放的比例,等比例进行缩放

import numpy as npimport cv2img = cv2.imread('1.png')rows, cols, channels = img.shapeM = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 0.6)dst = cv2.warpAffine(img, M, (rows, cols))cv2.imshow('img', img)cv2.imshow('dst', dst)cv2.waitKey(0)cv2.destroyAllWindows()

4.仿射变换

Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持了二维图形的“平直性“(即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变)。

cv2.getAffineTransform(src, dst) -> retval

  • src是原始图像中三个坐标点
  • dst是目标图像中三个对应的坐标点

import numpy as npimport cv2img = cv2.imread('1.png')rows, cols, channels = img.shapepts1 = np.float32([[40,50], [200,50], [100,250]])pts2 = np.float32([[10,50], [220,50], [100,250]])M = cv2.getAffineTransform(pts1, pts2)dst = cv2.warpAffine(img, M, (rows, cols))cv2.imshow('img', img)cv2.imshow('dst', dst)cv2.waitKey(0)cv2.destroyAllWindows()

5.透视变换

cv2.getPerspectiveTransform(src, dst) -> retval

  • src是原始图像中4个坐标点(任意3个点不能共线)
  • dst是目标图像中4个对应的坐标点

import numpy as npimport cv2img = cv2.imread('1.png')rows, cols, channels = img.shapepts1 = np.float32([[34,38], [237,33], [18,248], [251,251]])pts2 = np.float32([[0,0], [270,0], [0,270], [270,270]])M = cv2.getPerspectiveTransform(pts1, pts2)dst = cv2.warpPerspective(img, M, (270,270))cv2.imshow('img', img)cv2.imshow('dst', dst)cv2.waitKey(0)cv2.destroyAllWindows()
原创粉丝点击