1. 概述
为了方便开发人员的操作,OpenCV还提供了一些图像变换的API,本篇文章讲简单介绍各种API的使用,并附上一些样例。
2. 接口介绍
resize()
图像缩放函数,用于把图像按指定的尺寸放大或缩小。
dst = cv2.resize(src, dsize, fx, fy, interpolation)
dst = 生成的目的图像
src:需要变换的原图像
disize:(x, y)需要变换图像的尺寸,直接填
fx,fy:缩放因子,与disize会冲突,通常只需要二选一即可
interpolation:插值算法,用于缩放的算法。默认为双线性插值。
缩放算法参数
效果越好的算法运算越复杂,效果越好。反之相反。
import cv2 import numpy as np lina = cv2.imread('./image/lina.jpg') print(lina.shape) # 修改图像大小:fx,fy可以省略,默认为双线性插值 lina2 = cv2.resize(lina, (700, 700)) # 使用缩放因子,需要指定参数,并且dsize传空 lina3 = cv2.resize(lina, None, fx=2, fy=2, interpolation=cv2.INTER_AREA) cv2.imshow('lina', lina) cv2.imshow('lina3', lina3) cv2.waitKey(0)
flip()
图像翻转函数,讲图像上下翻转,左右翻转
img1 = cv2.flip(img,flipCode)
img:需要翻转的图片
flipCode:值为0,上下翻转;值>0,左右翻转;值<0,上下左右一起翻转。
import cv2 import numpy as np lina = cv2.imread('./image/lina.jpg') print(lina.shape) # 上下翻转 lina_0 = cv2.flip(lina, 0) # 左右翻转 lina_1 = cv2.flip(lina, 1) # 上下左右翻转 lina_01 = cv2.flip(lina, -1) cv2.imshow('lina', lina) cv2.imshow('lina_0', lina_0) cv2.imshow('lina_1', lina_1) cv2.imshow('lina_01', lina_01) cv2.waitKey(0)
rotate()
将图片按顺时针逆时针旋转一定角度
img2 = cv2.rotate(img, rotateCode)
img:需要旋转的图片
rotateCode:含义分别为:顺时针转90,180度,逆时针转90度。
rotateCode
import cv2 import numpy as np lina = cv2.imread('./image/lina.jpg') print(lina.shape) # 顺时针转90 lina_90 = cv2.rotate(lina, cv2.ROTATE_90_CLOCKWISE) # 顺时针转180 lina_180 = cv2.rotate(lina, cv2.ROTATE_180) # 顺时针转270,逆时针转90 lina_270 = cv2.rotate(lina, cv2.ROTATE_90_COUNTERCLOCKWISE) cv2.imshow('lina', lina) cv2.imshow('lina_90', lina_90) cv2.imshow('lina_180', lina_180) cv2.imshow('lina_270', lina_270) cv2.waitKey(0)
仿射变换
仿射变换是图像旋转、缩放、平移的总成。
warpAffine()
img2 = cv2.warp(src, M, dsize, flags, mode, value)
src:需要变换的图像
M:进行变换的矩阵,变换成什么样子由M决定,可以由特定接口来求。
dsize:输出图像的尺寸
flags:与resize函数的缩放算法一致,默认为双线性插值。
mode:边界处标志
value:填充边界的值
后三个参数一般都用默认,主要使用前3个参数
getRotationMatrix2D()-变换矩阵1
求变换矩阵M的函数,主要用于旋转
M = cv2.getRotationMatrix2D(center, angle, scale)
center:中心点,按住哪个点进行旋转
angle:旋转的角度(逆时针旋转)
scale:缩放比例,1.0不缩放
import cv2 import numpy as np lina = cv2.imread('./image/lina.jpg') print(lina.shape) # 变换前要求出变换矩阵 M = cv2.getRotationMatrix2D((200, 200), 30, 1.0) lina2 = cv2.warpAffine(lina, M, (474, 474)) cv2.imshow('lina', lina) cv2.imshow('lina2', lina2) cv2.waitKey(0)
getAffineTransform()-变换矩阵2
求变换矩阵M,主要是用于平移+旋转,利用三个坐标点前后变化来确定一个平面的变化
M = cv2.getAffineTransform(src[], dst[])
src:源坐标点,以列表的形式传入(数据格式一定为float32)
dst:变换后图的坐标,以列表的形式传入(数据格式一定为float32)
import cv2 import numpy as np lina = cv2.imread('./image/lina.jpg') print(lina.shape) # 变换前要求出变换矩阵 # 坐标一定要是32位的小数!!否则会报错 src = np.float32([[0, 0], [0, 100], [100, 0]]) dst = np.float32([[50, 50], [50, 150], [200,50]]) M = cv2.getAffineTransform(src, dst) lina2 = cv2.warpAffine(lina, M, (474, 474)) cv2.imshow('lina', lina) cv2.imshow('lina2', lina2) cv2.waitKey(0)
透视变换
完全改变物体的位置和形状,需要四个坐标点。一般用来调整图片的位置。
warpPerspective()
用于透视变换的主函数
img2 = cv2.warpPerspective(img, M, dsize, …)
img:需要进行变换的图像
M:进行透视变换的矩阵
dsize:输出图片的大小
getPerspectiveTransform()
用来求透视变换的矩阵,需要四个点
M = cv2.getPerspectiveTransform(src[], dst[])
src:源坐标点,以列表的形式传入(数据格式一定为float32)
dst:变换后图的坐标,以列表的形式传入(数据格式一定为float32)
import cv2 import numpy as np work = cv2.imread('./image/work.jpg') # 将图片调整到适合大小 work = cv2.resize(work, (700, 700), interpolation=cv2.INTER_AREA) # 设置适当变换坐标,求出变换矩阵 src = np.float32([[210, 20], [700, 110], [0, 660], [600, 700]]) dst = np.float32([[0, 0], [700, 0], [0, 700], [700, 700]]) M = cv2.getPerspectiveTransform(src, dst) # 进行透视变换 work2 = cv2.warpPerspective(work, M, (700, 700)) cv2.imshow('work', work) cv2.imshow('work2', work2) cv2.waitKey(0)
变换后如图所示,将主要图片变正了
以上就是图像变换的简单介绍,如果有疑问,欢迎在评论区讨论哦。