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

平移

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

旋转

# 旋转
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()

 

仿射变换

'''
仿射变换
在仿射变换中 原图中所有的平行线在结果图像中同样平行。
为了创建 这个矩阵,我们需要从原图像中找到三个点以及他们在 出图像中的位置。
然后 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()

 

透视变换

# -*- 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中几何变换 - 简书 (jianshu.com)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一壶浊酒..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值