OpenCV 几何变换

几何变换是指将一幅图像映射到另外一幅图像内的操作。根据OpenCV函数的不同,将映射关系划分为缩放、翻转、仿射变换、透视等。

案例来源于傅老师。

1.缩放

在OpenCV中,使用函数cv2.resize()实现对图像的缩放,具体形式为:

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

src:原图

dsize:输出图像的大小

fx:水平方向的缩放比例

fy:垂直方向的缩放比例

interpolation:插值方法

实践:

import cv2
import numpy as np

img=cv2.imread("pig.jpg")
rows,cols,_ = img.shape
size1 = (int(rows*0.9),int(cols*0.8))#宽变成0.9倍,长变成0.8倍
img_resize1 = cv2.resize(img,size1,cv2.INTER_AREA)
cv2.imshow("SRC",img)
cv2.imshow("RESIZE1",img_resize1)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.翻转

在OpenCV中,图像的翻转采用函数cv2.flip()实现,该函数能够实现图像在水平方向翻转、垂直方向翻转、两个方向同时翻转,具体形式为:

dst = cv2.flip(src, flipCode)

src:原图

flipCode:代表旋转类型

实践:

import cv2
import numpy as np

img_flip1=cv2.flip(img,0)#x轴翻转
cv2.imshow("FLIP1",img_flip1)
img_flip3=cv2.flip(img,1)#y轴翻转
cv2.imshow("FLIP2",img_flip2)
img_flip2=cv2.flip(img,-1)#x,y轴同时翻转
cv2.imshow("FLIP3",img_flip3)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.仿射

OpenCV中的仿射函数为cv2.warpAffine(),其通过一个变换矩阵(映射矩阵)M实现变换,具体为:

dst = cv2.warpAffine(src, M, dsize)

src:原图

M:代表一个2x3的变换矩阵。使用不同的变换矩阵,就可以实现不同的仿射变换。

dsize:输出图像的尺寸大小

平移:

import cv2
import numpy as np

rows,cols,_ = img.shape
x = 100
y = 200
M = np.float32([[1,0,x],[0,1,y]])#转换矩阵
img_move=cv2.warpAffine(img,M,(cols,rows))#平移操作,注意(cols,rows)
cv2.imshow("MOVE",img_move)
cv2.waitKey(0)
cv2.destroyAllWindows()

旋转:

在使用函数cv2.warpAffine()对图像进行旋转时,可以通过函数cv2.getRotationMatrix2D()获取转换矩阵,具体为:

retval = cv2.getRotationMatrix2D(center, angle, scale)

center:旋转的中心点

angle:旋转角度,正数为逆时针旋转,负数为顺时针旋转

scale:变换尺度(缩放大小)

实践:

import cv2
import numpy as np

height,width,_ = img.shape
M = cv2.getRotationMatrix2D((width/2, height/2), 45, 0.6)
img_rotate=cv2.warpAffine(img,M,(width, height))#平移操作
cv2.imshow("ROTATE",img_rotate)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.透视

透视变换通过函数cv2.warpPerspective() 实现,具体为:

dst = cv2.warpPerspective(src, M, dsize)

src:原图

dst:变换后的图

M:转换矩阵

dsize:变换后图像的大小

实践:

import cv2
import numpy as np

#读图
img = cv2.imread('lianxi.png')
rows, cols = img.shape[:2]

# 原始点阵
pts_o = np.float32([[45, 180], [220, 80], [60, 290], [270, 190]]) # 这四个点为原始图片上数独的位置
pts_d = np.float32([[0, 0], [200, 0], [0, 100], [200, 100]]) # 这是变换之后的图上四个点的位置

# 获取转换矩阵
M = cv2.getPerspectiveTransform(pts_o, pts_d)
# 应用变换
dst = cv2.warpPerspective(img, M, (200, 100)) # 最后一参数是输出dst的尺寸。可以和原来图片尺寸不一致。按需求来确定

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()


版权声明:本文为weixin_57556081原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。