python OpenCV学习笔记(九):图片的几何变形

官方文档 – https://docs.opencv.org/3.4.0/da/d6e/tutorial_py_geometric_transformations.html


缩放

import numpy as np
import cv2 as cv

img = cv.imread('test.jpg')

res = cv.resize(img, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC)

# OR

height, width = img.shape[:2]
res = cv.resize(img, (2*width, 2*height), interpolation=cv.INTER_CUBIC)

cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
dsize:输出图片的大小,如果为None,dsize = Size(round(fx*src.cols), round(fy*src.rwos))
fx:沿x轴的比例因子,当其等于0时,fx = (double)dsize.width / src.cols
fy:沿y轴的比例因子,当其等于0时,fy = (double)dsize.height / src.rows
dsize和fx、fy不能同时为0;当dsize和fx、fy都定义时,以dsize为准
interpolation:插值方式,默认为cv.INTER_LINEAR;详见cv::InterpolationFlags

位移

import cv2 as cv
import numpy as np


img = cv.imread('opencv.jpg', 0)
rows, cols = img.shape

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


cv.imshow('img', dst)
cv.waitKey(0)
cv.destroyAllWindows()

cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
M:变换矩阵
dsize:输出图片的大小,格式为(width,height),width=cols,height=rows

位移变换矩阵为:
这里写图片描述
如果知道位移方向(x,y),就是(tx,ty),用np.float32(),创建矩阵,然后传入cv.warpAffine()函数中。上例为x轴平移100,y轴平移50,(100,50)。

旋转

img = cv.imread('test.jpg', 0)
rows, cols = img.shape

M = cv.getRotationMatrix2D((cols/2, rows/2), 90, 1)
dst = cv.warpAffine(img, M, (cols, rows))

旋转矩阵为:
这里写图片描述
OpenCV也提供了缩放旋转,通过调节旋转点,你可以在任意你喜欢的位置旋转,修改旋转矩阵为下列矩阵:
这里写图片描述
其中
这里写图片描述
OpenCV提供了这个变换矩阵的方法:
cv.getRotationMatrix2D(center, angle, scale)
计算出一个二维旋转的仿射矩阵
center:旋转中心坐标
angle:旋转角度,正值意味着逆时针旋转,坐标原点为左上角
scale:缩放比例

仿射变换

在仿射变换中,原始图像中的所有平行线在输出图像中仍然是平行的。为了找到变换矩阵,我们需要从输入图像中得到三个点,以及它们在输出图像中的对应位置。然后cv.getAffineTransform将会创建一个2x3矩阵,它将被传递给cv.warpAffine
cv.getAffineTransform(src, dst)
cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
下面的示例,并查看我选择的点(以绿色表示):

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt


img = cv.imread('opencv.jpg')
rows, cols = img.shape[:2]

pts1 = np.float32([[50,50], [200,50], [50,200]])
pts2 = np.float32([[10,100], [200,50], [100,250]])

M = cv.getAffineTransform(pts1, pts2)

dst = cv.warpAffine(img, M, (cols, rows))

plt.subplot(121), plt.imshow(img), plt.title('Input')
plt.subplot(122), plt.imshow(dst), plt.title('Output')
plt.show()

python OpenCV学习笔记(九):图片的几何变形_第1张图片

视角转换

视角转换,需要一个3x3的矩阵。即使在转换之后,直线仍然是直的。创建这个矩阵,你需要在输入图中找四个点,和输出图中对应的四个点。在这4个点中,有3个不应该是共线的。然后通过
cv.getPerspectiveTransform创建矩阵,然后提供给cv.warpPerspective
cv.getPerspectiveTransform(src, dst)
cv.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
示例:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imread('sudoku.png')
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 = cv.getPerspectiveTransform(pts1, pts2)

dst = cv.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()

python OpenCV学习笔记(九):图片的几何变形_第2张图片

你可能感兴趣的:(OpenCV)