opencv 几何变换

opencv有两个变换函数,cv2.warpAffine(),和cv2.warpPerspective(),使用这两个函数可以实现图片的移动、旋转、仿射变换。cv2.warpAffine()接受的参数是2*3 的变换矩阵,cv2.warpPerspective()接收的参数的是3*3的变换矩阵

扩展缩放 cv2.resize()

扩展缩放是改变图像的尺寸大小。可以使用cv2.resize()实现这个功能。图像的尺寸可以自己设置,也可以指定缩放因子。

'''
扩展缩放
在缩放时我们推荐使用 cv2.INTER_AREA
在扩展时我们推荐使用 v2.INTER_CUBIC 慢) 和 v2.INTER_LINEAR。
默认情况下所有改变图像尺寸大小的操作使用的插值方法 是 cv2.INTER_LINEAR。
Resize(src, dst, interpolation=CV_INTER_LINEAR)
'''
import cv2
img = cv2.imread('img1.png')
# 下面的 None 本应 是 出图像的尺寸 但是因为后边我们设置了缩放因子
res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

# 我们直接设置输出图像的尺寸 所以不用设置缩放因子
# height, width = img.shape[:2]
# res = cv2.resize(img, (3 * width, 2 * height), interpolation=cv2.INTER_CUBIC)

cv2.imshow('resize', res)
cv2.imshow('src img', img)

cv2.waitKey()
cv2.destroyAllWindows()

平移

opencv 几何变换_第1张图片

import cv2
import numpy as np

img = cv2.imread('img1.png')
rows, cols,_ = img.shape

M = np.float32([[1, 0, 10], [0, 1, 50]])
dst = cv2.warpAffine(img, M, (cols, rows))

cv2.imshow('img', np.hstack((img,dst)))
cv2.imwrite('image.png',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv 几何变换_第2张图片

旋转

opencv 几何变换_第3张图片

# 旋转
import cv2
import numpy as np

img = cv2.imread('img1.png')
rows, cols ,_= img.shape

# 第一个参数为旋转中心 第二个为旋转角度
# 第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.6)

# 第三个参数是输出图像的尺寸中心
dst = cv2.warpAffine(img, M, ( cols,  rows))

cv2.imshow('img', np.hstack((dst,img)))
cv2.imwrite('image.png',np.hstack((dst,img)))
cv2.waitKey(0)
cv2.destroyAllWindows()

 opencv 几何变换_第4张图片

仿射变换

'''
仿射变换
在仿射变换中 原图中所有的平行线在结果图像中同样平行。
为了创建 这个矩阵,我们需要从原图像中找到三个点以及他们在 出图像中的位置。
然后 cv2.getAffineTransform 会创建一个 2x3 的矩  最后 个矩 会 传给 函数 cv2.warpAffine。
'''

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

img = cv2.imread('img1.png')
rows, cols, ch = img.shape
print(img.shape)

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

##创建一个2*3的矩阵
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imwrite('image.png',np.hstack((dst,img)))
cv2.imshow('image',np.hstack((dst,img)))
cv2.waitKey()

 opencv 几何变换_第5张图片

透视变换

# -*- coding: utf-8 -*-
'''
透视变换
对于透视变换 ,我们需要一个 3x3 变换矩 。
在变换前后直线 是直线。
构建 个变换矩  你需要在输入图像上找 4 个点, 以及他们在输出图 像上对应的位置。
四个点中的任意三个都不能共线。这个变换矩阵可以用函数 cv2.getPerspectiveTransform() 构建。
然后把这个矩阵传给函数 cv2.warpPerspective。

'''

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

img = cv2.imread('img1.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 = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (256, 256))

cv2.imshow('image',np.hstack((img,dst)))
cv2.imwrite('image.png',np.hstack((img,dst)))
cv2.waitKey()

 opencv 几何变换_第6张图片

参考文献
Opencv中几何变换 - 简书 (jianshu.com)

你可能感兴趣的:(opencv,opencv,人工智能,python)