OpenCV(十一):如何用OpenCV-python3实现图像的仿射、透视变换

  • 仿射变换

对于仿射变换,首先需要了解到3点(不共线)可以确定一个平面。我们需要在输入图像找3个点,以及他们在输出图像上对应的位置,并且三个点中的任意两个都不能共线。

cv2.getAffineTransform(input,output)的作用是由输出点和输入点来确定两者的关系矩阵。

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

img = cv2.imread('35.jpg')
rows,cols,ch = img.shape #行,列,颜色通道

#输入点
input = np.float32([[50,50],[200,50],[50,200]])
#输出点
output = np.float32([[10,100],[200,50],[100,250]])

#获得关系的矩阵
M = cv2.getAffineTransform(input,output)

#仿射变换的新图像
dst = cv2.warpAffine(img,M,(cols,rows)) #img:图像名称;M:仿射矩阵;(cols,rows):图像的宽,高

#plt.subplot函数的作用是将多个图放到一个平面里。这里的121可以理解成一个1行2列的图中从左到右、从上到下的第一个位置。
plt.subplot(121),plt.imshow(img),plt.title('Input') # 显示原图像、标题为Input

plt.subplot(122),plt.imshow(dst),plt.title('Output')# 显示仿射变换后图像、标题为Output

plt.show()

效果图如下所示:
OpenCV(十一):如何用OpenCV-python3实现图像的仿射、透视变换_第1张图片

  • 透视变换

对于透视变换,我们需要在输入图像找4个点,以及他们在输出图像上对应的位置。与仿射变换类似,这四个点中的任意三个都不能共线。

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

img1 = cv2.imread('35.jpg')
rows,cols,ch = img1.shape

# input: 选取的四个点任意三点不能共线
input = np.float32([[56,65],[368,62],[28,387],[389,390]])
output = np.float32([[0,0],[300,0],[0,300],[300,300]])

# 确定透视变换矩阵
M = cv2.getPerspectiveTransform(input,output)

# 透视变换后的新图片
img2 = cv2.warpPerspective(img1,M,(300,300))

plt.subplot(121) ,plt.imshow(img1),plt.title('Input')
plt.subplot(122) ,plt.imshow(img2),plt.title('Output')

plt.show()

效果图如下。
OpenCV(十一):如何用OpenCV-python3实现图像的仿射、透视变换_第2张图片

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