OpenCV初尝试5——图像的基本变换

5 图像的基本变换

5.1 图像的放大与缩小

  • cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

其中interpolation:插值算法主要有以下几种:

  • INTER_NEAREST:邻近插值,速度快,效果差
  • INTER_LINEAR:双线性插值,使用原图中的4个点进行插值
  • INTER_CUBIC:三次插值,原图中的16个点
  • INTER_AREA:区域插值,效果最好,计算时间最长
import cv2
import numpy as np


#导入图片
dog = cv2.imread('./dog.jpeg')

#要缩放的图片,缩放之后图片的大小,缩放之后的输出图片,x轴(宽度)、y轴(高度)缩放比,插值算法
new_dog1 = cv2.resize(dog, dsize=(800, 800), interpolation=cv2.INTER_NEAREST)
new_dog2 = cv2.resize(dog, dsize=(800, 800), interpolation=cv2.INTER_LINEAR)
new_dog3 = cv2.resize(dog, dsize=(800, 800), interpolation=cv2.INTER_CUBIC)
new_dog4 = cv2.resize(dog, dsize=(800, 800), interpolation=cv2.INTER_AREA)

#按照x,y轴的比例进行缩放
new_dog = cv2.resize(dog, dsize=None, fx=0.5, fy=0.5)


cv2.imshow('new_dog1', new_dog1)
cv2.imshow('new_dog2', new_dog2)
cv2.imshow('new_dog3', new_dog3)
cv2.imshow('new_dog4', new_dog4)
cv2.imshow('new_dog', new_dog)

cv2.waitKey(0)
cv2.destroyAllWindows() 

5.2 图像的翻转与旋转

5.2.1 图像的翻转

  • cv2.flip(src, flipCode[, dst]):图像翻转
    – flipCode = 0:上下翻转
    – flipCode > 0:左右翻转
    – flipCode < 0:上下左右翻转
#翻转
import cv2
import numpy as np

#导入图片
dog = cv2.imread('./dog.jpeg')

new_dog = cv2.flip(dog, -1)
cv2.imshow('dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.2.2 图像的旋转

  • cv2.rotate(src, rotateCode[, dst]):图像旋转
    – rotateCode:
    – 1.ROTATE_90_CLOCKWISE:90°顺时针旋转
    – 2.ROTATE_180:180°旋转
    – 3.ROTATE_90_COUNTERCLOCKWISE:90°逆时针旋转
#旋转
import cv2
import numpy as np

dog = cv2.imread('./dog.jpeg')

new_dog = cv2.rotate(dog, retateCode=cv2.ROTATE_90_COUNTERCLOCKWISE)
cv2.imshow('dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.3 图像的仿射变换

  • 仿射变换是图像旋转、缩放、平移的总称。具体的做法是通过一个矩阵和原图片坐标进行计算,得到新的坐标,完成变换。关键就是这个变换矩阵。
  • cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

5.3.1 仿射变换之平移

在这里插入图片描述

import cv2
import numpy as np

dog = cv2.imread('./dog.jpeg')

h, w, ch = dog.shape
#变换矩阵,最少是float32位的
M = np.float32([[1, 0, 100], [0, 1, 0]])
#注意OpenCV中先宽度后高度, 原图,变换矩阵,输出图片的大小,插值算法,边界外推法标志,填充边界值
new = cv2.warpAffine(dog, M, (w, h))

cv2.imshow('new', new)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.3.2 获取变换矩阵

仿射变换的关键就是计算变换矩阵,我们不可能每次都自己手算,OpenCV提供了计算变换矩阵的API。

  • cv2.getRotationMatrix2D(center, angle, scale)
    – center:图片以该点作为旋转的中心点
    – angle:旋转的角度(逆时针方向)
    – scale:缩放比例;想法图片进行什么样的缩放
import cv2
import numpy as np

dog = cv2.imread('./dog.jpeg')

h, w, ch = dog.shape

M = cv2.getRotationMatrix2D((w/2, h/2), 15, 1.0)

new = cv2.warpAffine(dog, M, (w, h))

cv2.imshow('new', new)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.getAffineTransform(src, dst):通过三点可以确定变换后的位置,相当于解方程,3个点对应三个方程,能解出偏移的参数和旋转的角度。
    – src:原目标的三个点
    – dst:对应变换后的三个点
import cv2
import numpy as np

dog = cv2.imread('./dog.jpeg')

h, w, ch = dog.shape

#一般是横向和纵向的点,所以一定会有2个点横坐标相同,2个点纵坐标相同
src = np.float32([[200, 100], [300, 100], [200, 300]])
dst = np.float32([[100, 150], [360, 200], [200, 120]])
M = cv2.getAffineTransform(src, dst)

new = cv2.warpAffine(dog, M, (w, h))

cv2.imshow('new', new)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.4 透视变换

透视变换就是将一种坐标系变换成另一种坐标系。简单来说可以把一张“斜”的图变“正”。

  • cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
  • M是一个3 * 3的矩阵
  • cv2.getPerspectiveTransform(src, dst):获取透视变换的变换矩阵,需要4个点,即图片的四个角
import cv2
import numpy as np


img = cv2.imread('./123.png')
print(img.shape)

src = np.float32([[100, 1100], [2100, 1100], [0, 4000], [2500, 3900]])
dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]])

M = cv2.getPerspectiveTransform(src, dst)

new = cv2.warpPerspective(img, M, (2300, 3000))

cv2.imshow('img', img)
cv2.imshow('new', new)

cv2.waitKey(0)
cv2.destroyAllWindows()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值