opencv几何变换(python)

1. 简介

在计算机视觉中,图像处理是不可或缺的一环。在处理图像时,我们常常需要对图像进行几何变换以达到我们想要的效果。在OpenCV库中,有很多可以使用的函数来实现这些几何变换。本文将介绍常用的几何变换以及在python中实现它们的方法。

2. 什么是几何变换?

几何变换是指对图像进行旋转、平移、缩放和翻转等操作来改变图像的几何形态。在OpenCV库中,有四种基本的几何变换,分别是平移(Translation)、旋转(Rotation)、缩放(Scaling)和翻转(Flipping)。

2.1 平移

平移是指将图像在水平方向或垂直方向上按像素进行移动的变换。在OpenCV库中,我们可以使用cv2.warpAffine()函数来进行平移操作。

代码示例:

import cv2

import numpy as np

img = cv2.imread('image.jpg')

rows,cols = img.shape[:2]

# 定义平移矩阵,向右平移100个像素,向下平移50个像素

M = np.float32([[1,0,100],[0,1,50]])

# 执行平移操作

dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',img)

cv2.imshow('dst',dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

代码说明:

img = cv2.imread('image.jpg'):读取图像。

rows,cols = img.shape[:2]:获取图像的行数和列数。

M = np.float32([[1,0,100],[0,1,50]]):定义平移矩阵M,它是一个2X3的矩阵,其中第一行表示水平位移,第二行表示垂直位移。

dst = cv2.warpAffine(img,M,(cols,rows)):用cv2.warpAffine()函数实现平移操作,并将结果存储在变量dst中。

cv2.imshow('img',img)和cv2.imshow('dst',dst):分别显示原始图像和平移后的图像。

cv2.waitKey(0):等待用户键盘输入。

cv2.destroyAllWindows():关闭所有窗口。

2.2 旋转

旋转是指将图像绕某个点按一定角度进行旋转的变换。在OpenCV库中,我们可以使用cv2.getRotationMatrix2D()和cv2.warpAffine()函数来实现旋转操作。

代码示例:

import cv2

img = cv2.imread('image.jpg')

rows,cols = img.shape[:2]

# 获取旋转矩阵

M = cv2.getRotationMatrix2D((cols/2,rows/2),45,1)

# 执行旋转操作

dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',img)

cv2.imshow('dst',dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

代码说明:

M = cv2.getRotationMatrix2D((cols/2,rows/2),45,1):获取旋转矩阵M,它是一个2X3的矩阵,其中第一行表示旋转角度,第二行表示缩放比例。

dst = cv2.warpAffine(img,M,(cols,rows)):用cv2.warpAffine()函数实现旋转操作,并将结果存储在变量dst中。

cv2.imshow('img',img)和cv2.imshow('dst',dst):分别显示原始图像和旋转后的图像。

cv2.waitKey(0):等待用户键盘输入。

cv2.destroyAllWindows():关闭所有窗口。

2.3 缩放

缩放是指通过增加或减少图像中像素的数量来改变图像的大小的变换。在OpenCV库中,我们可以使用cv2.resize()函数来执行缩放操作。

代码示例:

import cv2

img = cv2.imread('image.jpg')

# 将图像缩小到原来的一半

dst = cv2.resize(img,(0,0),fx=0.5,fy=0.5)

cv2.imshow('img',img)

cv2.imshow('dst',dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

代码说明:

dst = cv2.resize(img,(0,0),fx=0.5,fy=0.5):用cv2.resize()函数实现缩放操作,并将结果存储在变量dst中。在这个例子中,我们将图像缩小到原来的一半。

cv2.imshow('img',img)和cv2.imshow('dst',dst):分别显示原始图像和缩放后的图像。

cv2.waitKey(0):等待用户键盘输入。

cv2.destroyAllWindows():关闭所有窗口。

2.4 翻转

翻转是指将图像在水平或垂直方向上进行翻转的变换。在OpenCV库中,我们可以使用cv2.flip()函数来实现翻转操作。

代码示例:

import cv2

img = cv2.imread('image.jpg')

# 在水平方向上翻转图像

dst = cv2.flip(img,0)

cv2.imshow('img',img)

cv2.imshow('dst',dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

代码说明:

dst = cv2.flip(img,0):用cv2.flip()函数实现翻转操作,并将结果存储在变量dst中。在这个例子中,我们将图像在水平方向上进行翻转。

cv2.imshow('img',img)和cv2.imshow('dst',dst):分别显示原始图像和翻转后的图像。

cv2.waitKey(0):等待用户键盘输入。

cv2.destroyAllWindows():关闭所有窗口。

3. 使用鼠标进行图像变换

使用OpenCV库的cv2.getAffineTransform()和cv2.warpAffine()函数,我们可以在平面上对图像进行任意的仿射变换。这个过程中,我们可以通过鼠标完成对图像的操作。

代码示例:

import cv2

import numpy as np

# 定义回调函数,实现鼠标操作

def get_points(event,x,y,flags,param):

global points

if event == cv2.EVENT_LBUTTONDBLCLK:

points.append([x,y])

if len(points) == 3:

# 获取变换矩阵

M = cv2.getAffineTransform(np.float32(points[:3]),np.float32([[0,0],[511,0],[0,511]]))

# 应用变换矩阵

dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('dst',dst)

# 定义变量,用于存储鼠标点击的点

points = []

img = cv2.imread('image.jpg')

rows,cols = img.shape[:2]

cv2.namedWindow('image')

cv2.setMouseCallback('image',get_points)

while True:

cv2.imshow('image',img)

if cv2.waitKey(1) & 0xFF == 27:

break

cv2.destroyAllWindows()

代码说明:

def get_points(event,x,y,flags,param):定义鼠标操作回调函数。在这个例子中,我们将图像上鼠标点击的点传递给get_points()函数。

global points:定义全局变量points,用于存储鼠标点击的点。

if len(points) == 3::如果我们已经收集到了三个鼠标点击的点,则执行下面的代码。

M = cv2.getAffineTransform(np.float32(points[:3]),np.float32([[0,0],[511,0],[0,511]])):获取变换矩阵M。其中,第一个参数是源图像中的三个点的坐标,第二个参数是目标图像中的三个点的坐标。

dst = cv2.warpAffine(img,M,(cols,rows)):用cv2.warpAffine()函数执行仿射变换,并将结果存储在变量dst中。

cv2.setMouseCallback('image',get_points):定义回调函数,用于根据鼠标操作获取图像变换的参数。

4. 小结

本文介绍了几何变换的概念以及在OpenCV库中的实现方法。通过平移、旋转、缩放和翻转等基本变换,我们可以实现各种复杂的图像变换。在使用cv2.getAffineTransform()和cv2.warpAffine()函数时,我们可以通过鼠标获取图像变换的参数,从而实现对图像的任意仿射变换。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签