OpenCV基础入门—几何变换

© Fu Xianjun. All Rights Reserved.

文章目录

    • 几何变换
  • 一、缩放
  • 二、翻转
  • 三、图像仿射变换
    • 1.平移
    • 2.旋转
  • 四、透视
    • 小例题
      • 将图像通过透视变换矫正


几何变换

几何变换是指一幅图像映射到另外一幅图像内的操作。OpenCV提供了多个与映射有关的函数,这些函数使用起来方便灵活,能够高效地完成图像映射。
根据OpenCV函数的不同,将映射关系划分为缩放、翻转、仿射变换、透视、重映射等。


提示:以下是本篇文章正文内容,下面案例可供参考

一、缩放

使用函数cv2.resize()来实现对图像的缩放。
形式为:dst = cv2.resize(src, dsize [, fx [, fy [, interpolation] ] ] )

  • dst代表输出的目标图像,该图像的类型与src相同,其大小为dsize(当值非零),或者通过src.size()、fx、fy计算得到。
  • src代表需要缩放的原始图像。
  • dsize代表输出图像大小。
  • fx代表水平方向的缩放比例。
  • fy代表垂直方向的缩放比例。
  • interpolation代表插值方式。

(示例):将图片宽变成0.9倍,长变成0.8倍
代码如下(示例):

import cv2
import numpy as np
img=cv2.imread("pig.jpg")
rows,cols,_ = img.shape
size1 = (int(rows*0.9),int(cols*0.8))
img_resize1 = cv2.resize(img,size1)
cv2.imshow("SRC",img)
cv2.imshow("RESIZE1",img_resize1)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 当缩小图像时,使用区域插值方式(INTER_AREA)能够得到最好的效果;当放大图像时,使用三次样条插值(INTER_CUBIC)方式和双线性插值(INTER_LINEAR)方式都能够取得较好的效果。

二、翻转

使用函数cv2.flip()来实现对图像的翻转,水平翻转、垂直翻转、两个方向同时翻转。
形式为:dst = cv2.flip(src, flipCode)

  • dst代表和原始图像具有同样大小、类型的目标图像。
  • src代表需要处理的原始图像。
  • flipCode代表旋转类型。

flipCode参数的意义:

参数值 说明 意义
0 只能是0 绕着X轴转
正数 1、2、3等任意正数 绕着Y轴转
负数 -1、-2、-3等任意负数 围绕X、Y轴同时翻转

(示例):绕x轴翻转
代码如下(示例):

img_flip1=cv2.flip(img,0)#x轴翻转
cv2.imshow("FLIP1",img_flip1)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、图像仿射变换

函数cv2.warpAffine()实现仿射变换。
其语句为:dst = cv2.warAffine(src , M , dsize)

  • src代表要仿射的原始图像。
  • M代表一个2x3的变换矩阵。使用不同的变换矩阵,就可以实现不同的仿射变换。
  • dsize代表输出图像的尺寸大小。

1.平移

代码如下(示例):

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))
cv2.imshow("MOVE",img_move)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.旋转

语法:retval = cv2.getRotationMatrix2D(center,anle,scale)

  • center:旋转中心
  • angle:旋转角度,正数为逆时针旋转,负数为顺时针旋转
  • scale:缩放大小

代码如下(示例):

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

四、透视

语法1:转换矩阵 M = cv2.getPerspectiveTransform(pts_o, pts_d)

  • pts_o为原始4个点坐标。
  • pts_d为变换后4个点坐标。

语法2:dst = cv2.warpPerspective(img, M, dsize)

  • img为原图。
  • dst为变换后的图。
  • M为转换矩阵。
  • dsize为变换后图像的大小。

代码如下(示例):

img = cv2.imread('shudu.jpg')
rows, cols,_ = img.shape
pts_o = np.float32([[88, 177], [716, 85], [216, 695], [957, 551]]) 
pts_d = np.float32([[0, 0], [600, 0], [0, 600], [600, 600]]) 
M = cv2.getPerspectiveTransform(pts_o, pts_d)
dst = cv2.warpPerspective(img, M, (600, 600))
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

小例题

将图像通过透视变换矫正

代码如下(示例):

#读图
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))

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

效果如下(示例):
OpenCV基础入门—几何变换_第1张图片

你可能感兴趣的:(OpenCV,opencv)