【OpenCV图像处理5】图像的变换

简介: 【OpenCV图像处理5】图像的变换

五、图像的变换

1、图像的基本变换

1.1 图像的缩放

resize用法:

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

参数说明:

  • src:进行缩放的图像
  • dsize:缩放之后图像的大小(元组或列表表示即可)
  • dst:可选参数,缩放之后的输出图像
  • fx, fy:x轴和y轴的缩放比,即宽度和高度的缩放比
  • interpolation:插值算法,主要有以下几种:
算法 描述
INTER_NEAREST 邻近插值,速度快,效果差
INTER_LINEAR 双线性插值,使用原图中的4个点进行插值(默认)
INTER_CUBIC 三次插值,原图中的16个点
INTER_AREA 区域插值,效果最好,计算时间最长

1、原图像:480 * 640

2、dsize = (320, 240) 缩放之后的图像:

new_dog = cv2.resize(dog, (320, 240))

3、fx=0.7, fy=0.7 缩放之后的图像:

new_dog = cv2.resize(dog, None, fx=0.7, fy=0.7)

4、INTER_NEAREST(左)、INTER_LINEAR(右)

5、INTER_CUBIC(左)、INTER_AREA(右)

代码实现:

import cv2
dog = cv2.imread('../resource/r_dog.jpg')
# new_dog = cv2.resize(dog, (320, 240))
# new_dog = cv2.resize(dog, None, fx=0.7, fy=0.7)
new_dog = cv2.resize(dog, None, fx=0.7, fy=0.7, interpolation=cv2.INTER_CUBIC)
cv2.imshow('dog', dog)
cv2.imshow('new_dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.2 图像的翻转

flip()用法:

cv2.flip(src, flipCode)

参数说明:

  • src:进行翻转的图像
  • flipCode
  • flipCode = 0:表示上下翻转
  • flipCode > 0:表示左右翻转
  • flipCode < 0:上下 + 左右

1、flipCode = 0:表示上下翻转

up_down = cv2.flip(cat, flipCode=0)

2、flipCode > 0:表示左右翻转

left_right = cv2.flip(cat, flipCode=1)

3、flipCode < 0:上下 + 左右

up_down_left_right = cv2.flip(cat, flipCode=-1)

代码实现:

import cv2
import numpy as np
cat = cv2.imread('../resource/r_cat.jpg')
up_down = cv2.flip(cat, flipCode=0)
cv2.imshow('up_down', np.hstack((cat, up_down)))
cv2.waitKey(0)
cv2.destroyAllWindows()

1.3 图像的旋转

rotate()用法:

rotate(src, rotateCode)

参数说明:

  • src:进行旋转的图像
  • rotateCode
rotateCode 描述
ROTATE_90_CLOCKWISE 顺时针 90°
ROTATE_180 180°
ROTATE_90_COUNTERCLOCKWISE 逆时针 90°

原图像 VS 旋转180°

代码实现:

import cv2
import numpy as np
dog = cv2.imread('../resource/r_dog.jpg')
new = cv2.rotate(dog, cv2.ROTATE_180)
cv2.imshow('dog', np.hstack((dog, new)))
cv2.waitKey(0)
cv2.destroyAllWindows()

2、图像的仿射变换

仿射变换是图像旋转、缩放、平移的总称。

具体的做法是通过一个矩阵和原图像坐标进行计算,得到新的坐标,完成变换,所以关键就是这个变换矩阵。

warpAffine用法:

cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue)

参数说明:

  • src:进行变换的图像
  • M:变换矩阵
  • dsize:输出图像大小
  • dst:可选参数,缩放之后的输出图像
  • flags:与resize中的插值算法一致
  • borderMode:边界外推法标志
  • borderValue:填充边界的值

2.1 图像平移

矩阵中的每个像素由(x, y)组成,因此,其变换矩阵是2 * 2的矩阵。

平移向量为2 * 1的向量,所在平移矩阵为2 * 3矩阵

代码实现: x, y 均平移100

import cv2
import numpy as np
# 导入图像
dog = cv2.imread('../resource/r_dog.jpg')
h, w, ch = dog.shape
M = np.float32([[1, 0, 100], [0, 1, 100]])
# 注意:先宽度、再高度
new = cv2.warpAffine(dog, M, (w, h))
cv2.imshow('dog', np.hstack((dog, new)))
cv2.waitKey(0)
cv2.destroyAllWindows()

2.2 获取变换矩阵

仿射变换的难点就是计算变换矩阵,OpenCV提供了计算变换矩阵的API:

getRotationMatrix2D()用法:

cv2.getRotationMatrix2D(center, angle, scale)

参数说明:

  • center:中心点,以图像的哪个点作为旋转的中心点
  • angle:角度,旋转的角度,按照逆时针旋转
  • scale:缩放比例,想把图像进行什么样的缩放

代码实现: 以原图像中心点逆时针旋转45°

import cv2
import numpy as np
# 导入图像
dog = cv2.imread('../resource/r_dog.jpg')
h, w, ch = dog.shape
# 获取变换矩阵
M = cv2.getRotationMatrix2D((w / 2, h / 2), 45, 1.0)
new = cv2.warpAffine(dog, M, (w, h))
cv2.imshow('dog', np.hstack((dog, new)))
cv2.waitKey(0)
cv2.destroyAllWindows()

getAffineTransform()用法:

cv2.getAffineTransform(src, dst)

参数说明:

  • src:原目标的3个点
  • dst:对应变换后的3个点

通过三个点可以确定变换后的位置,相当于解方程,三个点对应三个方程,能解出偏移的参数和旋转的角度。

代码实现:

import cv2
import numpy as np
# 导入图像
dog = cv2.imread('../resource/r_dog.jpg')
h, w, ch = dog.shape
src = np.float32([[100, 200], [200, 100], [200, 300]])
dst = np.float32([[100, 150], [360, 200], [280, 120]])
M = cv2.getAffineTransform(src, dst)
new = cv2.warpAffine(dog, M, (w, h))
cv2.imshow('dog', np.hstack((dog, new)))
cv2.waitKey(0)
cv2.destroyAllWindows()

3、图像的透视变换

透视变换就是将一种坐标系变成另一种坐标系。简单的来说,可以把一张“斜”的图像变“正”。

warpPerspective()用法:

cv2.warpPerspective(src, M, dsize, dst, flags, borderMode,borderValue)

对于透视变换来说,M是一个3 * 3的矩阵。

getPerspectiveTransform()用法:

cv2.getPerspectiveTransform(src, dst, solveMethod)

获取透视变换的变换矩阵,需要4个点,即图像的4个角。

代码实现:

import cv2
import numpy as np
# 导入图像
six = cv2.imread('../resource/six.jpg')
print(six.shape)
src = np.float32([[100, 100], [670, 100], [100, 960], [670, 960]])
dst = np.float32([[0, 0], [620, 0], [0, 860], [570, 860]])
M = cv2.getPerspectiveTransform(src, dst)
new = cv2.warpPerspective(six, M, (570, 860))
cv2.imshow('six', six)
cv2.imshow('new', new)
cv2.waitKey(0)
cv2.destroyAllWindows()

目录
相关文章
|
5月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
207 7
|
4月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
922 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
5月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
76 4
|
5月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
4月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
164 7
|
6月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
6月前
|
计算机视觉 Python
如何使用OpenCV进行基本图像处理
使用OpenCV进行基本图像处理包括安装OpenCV,读取与显示图像,转换图像颜色空间(如从BGR到RGB),调整图像大小,裁剪特定区域,旋转图像,以及应用图像滤镜如高斯模糊等效果。这些基础操作是进行更复杂图像处理任务的前提。OpenCV还支持特征检测、图像分割及对象识别等高级功能。
WK
66 4
WK
|
6月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
181 1
|
8月前
|
计算机视觉
opencv之形态变换
opencv之形态变换
|
8月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
282 1