OpenCV学习笔记9-几何变换

图像几何变换(移动,旋转,仿射变换等)。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 cv2
import numpy as np

img = 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 cv2
import numpy as np

img = cv2.imread('1.png')
rows, cols, channels = img.shape

M = np.float32([[1,0,20], [0,1,50]])  #沿x方向平移20,沿y方向平移50
dst = 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 np
import cv2

img = cv2.imread('1.png')
rows, cols, channels = img.shape

M = 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 np
import cv2

img = cv2.imread('1.png')
rows, cols, channels = img.shape

pts1 = 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 np
import cv2

img = cv2.imread('1.png')
rows, cols, channels = img.shape

pts1 = 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()

你可能感兴趣的:(opencv学习笔记,opencv)