【OpenCV】图像变换(缩放、平移、旋转、仿射)

文章目录

  • 前言
  • 1. 缩放变换
  • 2. 平移变换
  • 3. 旋转变换
  • 4. 仿射变换


前言

图像变换是指通过对图像进行缩放、平移、旋转、仿射、透视等变换来改变图像的形状和大小。在本篇博客中,我们将详细介绍OpenCV中的图像变换函数,并提供示例代码以帮助读者更好地理解这些函数的使用方法。


1. 缩放变换

缩放变换是指通过改变图像的大小来改变图像的形状。在OpenCV中,可以使用resize函数实现缩放变换。该函数的原型如下:

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )

其中,src表示原图像,dst表示输出图像,dsize表示输出图像的大小,fx和fy表示在x和y方向上的缩放因子,interpolation表示缩放方法,常见的有以下5种:

  1. cv2.INTER_NEAREST 最近邻插值法;
  2. cv2.INTER_LINEAR 双线性插值法(默认)(推荐放大处理);
  3. cv2.INTER_AREA 基于局部像素点的重采样(推荐缩小处理);
  4. cv2.INTER_CUBIC 基于4x4像素邻域的3次插值法(推荐放大处理);
  5. cv2.INTER_LANCZOS4 基于8x8像素邻域的lanczos插值;

下面是一个简单的示例代码,展示如何使用resize函数进行图像缩放:

import cv2

# 加载图像
img = cv2.imread('input.jpg')

# 缩放图像
resized_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)

# 显示缩放后的图像
cv2.imshow('Resized Image', resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的示例代码中,我们首先使用cv2.imread函数加载输入图像,然后使用cv2.resize函数将图像缩小一半,最后使用cv2.imshow函数显示缩放后的图像。

2. 平移变换

**平移变换是指通过改变图像的位置来改变图像的形状。**在OpenCV中,可以使用warpAffine函数实现平移变换。该函数的原型如下:

void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

其中,src表示原图像,dst表示输出图像,M表示变换矩阵,dsize表示输出图像的大小,flags表示插值方法,borderMode表示边界填充模式,borderValue表示填充颜色。

下面是一个简单的示例代码,展示如何使用warpAffine函数进行图像平移:

import cv2
import numpy as np

# 加载图像
img = cv2.imread('input.jpg')

# 定义平移矩阵
M = np.float32([[1, 0, 100], [0, 1, 50]])

# 平移图像
translated_img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))

# 显示平移后的图像
cv2.imshow('Translated Image', translated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的示例代码中,我们首先使用cv2.imread函数加载输入图像,然后定义一个平移矩阵M,其中第一行表示在x方向上平移100个像素,第二行表示在y方向上平移50个像素。最后,我们使用cv2.warpAffine函数对图像进行平移,并使用cv2.imshow函数显示平移后的图像。

3. 旋转变换

**旋转变换是指通过改变图像的方向来改变图像的形状。**在OpenCV中,可以使用getRotationMatrix2D和warpAffine函数实现旋转变换。getRotationMatrix2D函数用于计算旋转矩阵,warpAffine函数用于对图像进行旋转变换。这两个函数的原型如下:

Mat getRotationMatrix2D(Point2f center, double angle, double scale);
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

其中,center表示旋转中心,angle表示旋转角度,scale表示缩放因子,src表示原图像,dst表示输出图像,M表示变换矩阵,dsize表示输出图像的大小,flags表示插值方法,borderMode表示边界填充模式,borderValue表示填充颜色。

下面是一个简单的示例代码,展示如何使用getRotationMatrix2D和warpAffine函数进行图像旋转:

import cv2
import numpy as np

# 加载图像
img = cv2.imread('input.jpg')

# 计算旋转矩阵
center = (img.shape[1] / 2, img.shape[0] / 2)
angle = 45
scale = 1
M = cv2.getRotationMatrix2D(center, angle, scale)

# 旋转图像
rotated_img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))

# 显示旋转后的图像
cv2.imshow('Rotated Image', rotated_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的示例代码中,我们首先使用cv2.imread函数加载输入图像,然后使用cv2.getRotationMatrix2D函数计算旋转矩阵M,其中center表示旋转中心,angle表示旋转角度,scale表示缩放因子。最后,我们使用cv2.warpAffine函数对图像进行旋转,并使用cv2.imshow函数显示旋转后的图像。

4. 仿射变换

**仿射变换是指通过线性变换来改变图像的形状。**在OpenCV中,可以使用getAffineTransform和warpAffine函数实现仿射变换。getAffineTransform函数用于计算仿射变换矩阵,warpAffine函数用于对图像进行仿射变换。这两个函数的原型如下:

Mat getAffineTransform(const Point2f src[], const Point2f dst[]);
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar() )

其中,src表示原图像中的三个点,dst表示变换后的三个点,M表示变换矩阵,dsize表示输出图像的大小,flags表示插值方法,borderMode表示边界填充模式,borderValue表示填充颜色。

下面是一个简单的示例代码,展示如何使用getAffineTransform和warpAffine函数进行仿射变换:

import cv2
import numpy as np

# 加载图像
img = cv2.imread('input.jpg')

# 定义原图像中的三个点和变换后的三个点
src_points = np.float32([[50, 50], [200, 50], [50, 200]])
dst_points = np.float32([[10, 100], [200, 50], [100, 250]])

# 计算仿射变换矩阵
M = cv2.getAffineTransform(src_points, dst_points)

# 仿射变换图像
affine_img = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))

# 显示变换后的图像
cv2.imshow('Affine Image', affine_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的示例代码中,我们首先使用cv2.imread函数加载输入图像,然后定义原图像中的三个点和变换后的三个点,其中src_points表示原图像中的三个点的坐标,dst_points表示变换后的三个点的坐标。最后,我们使用cv2.getAffineTransform函数计算仿射变换矩阵M,并使用cv2.warpAffine函数对图像进行仿射变换,并使用cv2.imshow函数显示变换后的图像。

除了以上介绍的几种变换,OpenCV中还提供了许多其他的图像变换函数,例如透视变换、极坐标变换等等,后续给大家分享。

你可能感兴趣的:(OpenCV,计算机视觉,opencv,计算机视觉,图像处理)