首页 > 其他分享 >Opencv第五章——几何变换

Opencv第五章——几何变换

时间:2024-08-30 09:52:00浏览次数:13  
标签:img dst cv2 像素 Opencv 几何变换 第五章 图像 np

1. 缩放

我们可以通过OpenCV提供的resize()方法实现随意更改图像的大小比例,语法格式如下:

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

参数说明:

src: 原始图像

dsize: 输出图像的大小,格式为(宽, 高), 单位为像素

fx: 可选参数, 水平方向上缩放比例

fy:可选参数, 竖直方向上的缩放比例

interpolation:可选参数,缩放的插值方式(指定算法对图像的放大或缩小进行像素的删减和补充)

返回值说明:

dst: 缩放之后的图像

1.1 使用dsize参数实现

dsize参数是一个元组,例如(100, 200),若使用dsize参数,就可以不写fx, fy参数

实现代码如下:

import cv2
img = cv2.imread(r"B:\Python_opencv_book\05\01\demo.png")  
dst1 = cv2.resize(img, (100, 100))  # 按照宽100像素、高100像素的大小进行缩放
dst2 = cv2.resize(img, (400, 400))  # 按照宽400像素、高400像素的大小进行缩放
cv2.imshow("img", img)  # 原图
cv2.imshow("dst1", dst1)  # 缩放图像
cv2.imshow("dst2", dst2)  
cv2.waitKey() 
cv2.destroyAllWindows()  

图像变换结果:

1.2 使用fx参数和fy参数实现

fx参数和fy参数可以使用浮点值,小于1表示缩小,大于1表示放大

计算公式如下:

新图像宽度:round(fx X 原图像宽度)

新图像高度:round(fy X 原图像高度)

实现代码如下:

import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg")  
dst3 = cv2.resize(img, None, fx=1 / 3, fy=1 / 2)  # 将宽缩小到原来的1/3、高缩小到原来的1/2
dst4 = cv2.resize(img, None, fx=2, fy=2)  # 将宽高扩大2倍
cv2.imshow("img", img)  
cv2.imshow("dst3", dst3)  
cv2.imshow("dst4", dst4)  
cv2.waitKey()  
cv2.destroyAllWindows()  

图像变换结果:

2. 翻转

Opencv使用cv2.flip()方法实现翻转效果,语法结构如下:

dst = cv2.flip(src, flipCode)

参数说明:

src:原始图像

flipCode:翻转类型

   0:沿着X轴翻转、

   正数:沿着Y轴翻转

   负数: 同时沿着X轴, Y轴翻转

返回值说明:

dst:翻转之后的图像

翻转操作实现代码:

import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(2).jpg")  
dst1 = cv2.flip(img, 0)  # 沿X轴翻转
dst2 = cv2.flip(img, 1)  # 沿Y轴翻转
dst3 = cv2.flip(img, -1)  # 同时沿X轴、Y轴翻转
cv2.imshow("img", img)  # 原图
cv2.imshow("dst_X", dst1)  # 翻转之后的图像
cv2.imshow("dst_Y", dst2)
cv2.imshow("dst3_XY", dst3)
cv2.waitKey()  
cv2.destroyAllWindows()  

 图像翻转结果:

3. 仿射变换

       仿射变换是一种保持点、直线和面之间的平行关系的线性变换。简单来说,它是一种几何变换,包括了平移、缩放、旋转和剪切等操作,可以把一个图形变换成另一个图形,而不改变图形的基本结构。

       Opencv使用cv2.warpAffine()方法实现仿射变换效果,语法结构如下:

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

参数说明:

src:原始图像

M:一个二行三列的矩阵, 根据此矩阵的值变换原图中的像素位置

dsize:输出图像的尺寸大小

flags:可选参数, 插值方式

borderMode:可选参数, 边界类型

borderValue:可选参数, 边界值, 默认为0

返回值说明:

dst:输出图像

M叫做仿射矩阵, 实际上是一个2X3的列表:

                                      [[a, b, c],[d, e, f]]

输出图像按照以下公式进行计算

                                      (横坐标)新x = 原x  乘以 a + 原y 乘以 b + c 

                                    (纵坐标)新y = 原y  乘以 d + 原y 乘以 e + f

下面介绍创建M的两种方式:

                                        import numpy as np

                                        M = np.zeros((2, 3), np.float32)

                                        improt numpy as np

                                        M = np.float32([[1, 2, 3],[4, 5, 6]])

3.1 平移

M = [[1, 0, 水平移动的距离], [0, 1, 垂直移动的距离]]

若水平移动距离为正数,则向右移动

若垂直移动距离为正数, 则向下移动

实现代码如下(右下方平移):

import cv2
import numpy as np
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(2).jpg")  
rows = len(img)  # 图像像素行数
cols = len(img[0])  # 图像像素列数
M = np.float32([[1, 0, 50],  # 横坐标向右移动50像素
                [0, 1, 100]])  # 纵坐标向下移动100像素
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow("img", img)  # 原图
cv2.imshow("dst", dst)  # 仿射变换效果
cv2.waitKey()  
cv2.destroyAllWindows()  

操作结果图片如下:

大家可以自行修改M的值来尝试进行其他方向的移动!!! 

3.2 旋转

Opencv提供了getRotationMatrix2D()方法来自动计算出旋转图像的M矩阵,语法格式如下:

M = getRotationMatrix2D(certer, angle, scale)

参数说明:

certer:旋转的中心点坐标

angle:旋转的角度(正数逆时针, 负数顺时针)

scale:缩放比例(浮点类型)

返回值说明:

M:计算出的仿射矩阵 

 旋转实现代码:

import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(2).jpg")  
rows = len(img)  # 图像像素行数
cols = len(img[0])  # 图像像素列数
center = (rows / 2, cols / 2)  # 图像的中心点
M = cv2.getRotationMatrix2D(center, 30, 0.8)  # 以图像为中心,逆时针旋转30度,缩放0.8倍
dst = cv2.warpAffine(img, M, (cols, rows))  # 按照M进行仿射
cv2.imshow("img", img)  # 原图
cv2.imshow("dst", dst)  # 仿射变换效果
cv2.waitKey()  
cv2.destroyAllWindows()  

操作图像结果:

3.3 倾斜

OpenCV通过定位图像的三个点来计算倾斜效果(左上, 右上,左下),并根据这三个点的位置变化计算其他像素的位置变化。OpenCV提供了getSffineTransform()方法来激素那倾斜图像的M矩阵。语法格式如下:

M = cv2.getAffineTransform(src, dst)

参数说明:

src: 原图三个点坐标, 格式为3行2列的32位浮点数列表

dst: 倾斜图像的三个点坐标, 格式为3行2列的32位浮点数列表

返回值说明:

M:计算出的仿射矩阵

 实现向右倾斜效果:

import cv2
import numpy as np
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(2).jpg")  
rows = len(img)  # 图像像素行数
cols = len(img[0])  # 图像像素列数
p1 = np.zeros((3, 2), np.float32)  # 32位浮点型空列表,原图三个点
p1[0] = [0, 0]  # 左上角点坐标
p1[1] = [cols - 1, 0]  # 右上角点坐标
p1[2] = [0, rows - 1]  # 左下角点坐标
p2 = np.zeros((3, 2), np.float32)  # 32位浮点型空列表,倾斜图三个点
p2[0] = [50, 0]  # 左上角点坐标,向右挪50像素
p2[1] = [cols - 1, 0]  # 右上角点坐标,位置不变
p2[2] = [0, rows - 1]  # 左下角点坐标,位置不变
M = cv2.getAffineTransform(p1, p2)  # 根据三个点的变化轨迹计算出M矩阵
dst = cv2.warpAffine(img, M, (cols, rows))  # 按照M进行仿射
cv2.imshow('img', img)  # 原图
cv2.imshow('dst', dst)  # 仿射变换效果
cv2.waitKey()  
cv2.destroyAllWindows()  

效果图像:

 大家可以尝试如何将图像进行向左倾斜!!!

示例代码入下:

import cv2
import numpy as np
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(2).jpg")  
rows = len(img)  # 图像像素行数
cols = len(img[0])  # 图像像素列数
p1 = np.zeros((3, 2), np.float32)  # 32位浮点型空列表,原图三个点
p1[0] = [0, 0]  # 左上角点坐标
p1[1] = [cols - 1, 0]  # 右上角点坐标
p1[2] = [0, rows - 1]  # 左下角点坐标
p2 = np.zeros((3, 2), np.float32)  # 32位浮点型空列表,倾斜图三个点
p2[0] = [0, 0]  # 左上角点坐标不变
p2[1] = [cols - 1 - 50, 0]  # 右上角点坐标向左移动50像素
p2[2] = [50, rows - 1]  # 左下角点坐标向右移动50像素
M = cv2.getAffineTransform(p1, p2)  # 根据三个点的变化轨迹计算出M矩阵
dst = cv2.warpAffine(img, M, (cols, rows))  # 按照M进行仿射
cv2.imshow('img', img)  # 原图
cv2.imshow('dst', dst)  # 仿射变换效果
cv2.waitKey()  
cv2.destroyAllWindows()  

效果图像: 

 

4.透视

OpenCV需要通过定位图像的四个点来计算透视效果,该操作不保证图像的“平直性”和“平行性”。OpenCV通过warpPerspective()方法来实现透视效果,语法结构如下:

dst = cv2.warpPerspective(src, M, dsize, flags, boarderMode, boarderValue)

参数说明:

src:原始图像

M:3行3列矩阵

dsize:输出图像尺寸大小

flags:可选参数, 插值方式

borderMode:可选参数, 边界类型

borderValue:可选参数, 边界值

返回值说明:

dst:透视变换后的输出图像

OpenCV提供了getPerspectiveTransform()方法来计算M矩阵, 该方法语法结构如下:

M = cv2.getPerspectiveTransform(src, dst)

参数说明:

src: 原图四个点坐标, 格式为4行2列的32位浮点数列表

dst: 透视图的四个点坐标

返回值说明:

M:计算出的仿射矩阵

 模拟从底部观察图像得到的透视效果:

import cv2
import numpy as np
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(2).jpg")  
rows = len(img)  # 图像像素行数
cols = len(img[0])  # 图像像素列数
p1 = np.zeros((4, 2), np.float32)  # 32位浮点型空列表,保存原图四个点
p1[0] = [0, 0]  # 左上角点坐标
p1[1] = [cols - 1, 0]  # 右上角点坐标
p1[2] = [0, rows - 1]  # 左下角点坐标
p1[3] = [cols - 1, rows - 1]  # 右下角点坐标
p2 = np.zeros((4, 2), np.float32)  # 32位浮点型空列表,保存透视图四个点
p2[0] = [90, 0]  # 左上角点坐标,向右移动90像素
p2[1] = [cols - 90, 0]  # 右上角点坐标,向左移动90像素
p2[2] = [0, rows - 1]  # 左下角点坐标,位置不变
p2[3] = [cols - 1, rows - 1]  # 右下角点坐标,位置不变
M = cv2.getPerspectiveTransform(p1, p2)  # 根据四个点的变化轨迹计算出M矩阵
dst = cv2.warpPerspective(img, M, (cols, rows))  # 按照M进行仿射
cv2.imshow('img', img)  # 原图
cv2.imshow('dst', dst)  # 仿射变换效果
cv2.waitKey()  
cv2.destroyAllWindows()  

效果图像:

 

 大家也来试试如下实现从顶部观察图像实现的透视效果吧!!!

下面是我给出的示例:

import cv2
import numpy as np
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(2).jpg")  
rows = len(img)  # 图像像素行数
cols = len(img[0])  # 图像像素列数
p1 = np.zeros((4, 2), np.float32)  # 32位浮点型空列表,保存原图四个点
p1[0] = [0, 0]  # 左上角点坐标
p1[1] = [cols - 1, 0]  # 右上角点坐标
p1[2] = [0, rows - 1]  # 左下角点坐标
p1[3] = [cols - 1, rows - 1]  # 右下角点坐标
p2 = np.zeros((4, 2), np.float32)  # 32位浮点型空列表,保存透视图四个点
p2[0] = [0, 0]  # 左上角点坐标位置不变
p2[1] = [cols - 1, 0]  # 右上角点坐标位置不变
p2[2] = [90, rows - 1]  # 左下角点坐标向右移动90像素
p2[3] = [cols - 90, rows - 1]  # 右下角点坐标向左移动90像素
M = cv2.getPerspectiveTransform(p1, p2)  # 根据四个点的变化轨迹计算出M矩阵
dst = cv2.warpPerspective(img, M, (cols, rows))  # 按照M进行仿射
cv2.imshow('img', img)  # 原图
cv2.imshow('dst', dst)  # 仿射变换效果
cv2.waitKey()  
cv2.destroyAllWindows()  

效果图像:

 

本章节内容就到此结束了,欢迎大家继续关注后续内容!!! 

标签:img,dst,cv2,像素,Opencv,几何变换,第五章,图像,np
From: https://blog.csdn.net/2301_80166849/article/details/141687909

相关文章

  • opencv开发环境搭建
    从github下载opencv最新源码https://github.com/opencv/opencv,目前最新是5e93c8202363a13fc72df30f8c14069c5ab66e42.Ubuntu环境下编译安装依赖库:sudoapt-getinstallbuild-essentialsudoapt-getinstallcmakegitlibgtk2.0-devpkg-configlibavcodec-devliba......
  • OpenCV(cv::findChessboardCorners())
    目录1.函数原型2.使用场景3.工作原理4.示例4.1角点精细化4.2附加标志5.注意事项cv::findChessboardCorners()是OpenCV提供的一个函数,常用于计算机视觉中的棋盘图像角点检测,特别是相机标定(calibration)和三维重建相关的任务中。1.函数原型boolcv::findChessboard......
  • OpenCV(cv::normalize())
    目录1.函数原型:2.使用场景:3.示例:cv::normalize()是OpenCV中用于将数据值缩放到指定范围或对数据进行归一化处理。1.函数原型:voidcv::normalize(InputArraysrc,OutputArraydst,doublealpha=1,doublebeta=0,intnorm_type=NORM_L2,intdtype=-1,I......
  • OpenCV(cv::dft())
    目录1.函数定义2.示例3.使用场景4.注意事项5.总结cv::dft()是OpenCV中用于计算离散傅里叶变换(DFT)的函数。傅里叶变换是一种重要的数学工具,用于将信号从时域转换到频域。这在图像处理和信号处理领域非常有用,例如滤波、卷积、图像频率分析等。1.函数定义voidcv::......
  • OpenCV(cv::mulSpectrums())
    目录1.函数定义2.工作原理3.示例4.典型应用5.总结cv::mulSpectrums()是OpenCV中用于频域信号处理的一个函数,它可以将两个频域的傅里叶变换结果相乘。通常用于频域滤波、卷积、相关性计算等任务。1.函数定义voidcv::mulSpectrums(InputArraya,InputArrayb,Out......
  • OpenCV(cv::idft())
    目录1.函数2.示例3.应用场景4.注意事项5.总结cv::idft()是OpenCV中用于计算逆离散傅里叶变换(IDFT)的函数,它将频域的数据转换回时域。它常与cv::dft()配合使用,例如在进行频域滤波后,需要使用cv::idft()将处理后的数据转换回图像的空间域。1.函数voidcv::idft(......
  • Clion\+OpenCV(C\+\+版)开发环境配置教程Win/Mac
    合集-环境配置(2)1.最全!嵌入式STM32单片机开发环境配置教学Win/Mac!!!08-282.最简最速!C++版OpenCV安装配置教程Win/Mac!!!08-28收起Clion+OpenCV(C++版)开发环境配置教程Win/Mac平时在学习和比赛的时候都是使用的Python版本的OpenCV,最近遇到了一个项目使用的上位机性能有限于是决定......
  • OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接
    若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/141561865长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…OpenCV开发专栏......
  • 25版王道数据结构课后习题详细分析 第五章 树与二叉树 5.4 树、森林
    一、单项选择题————————————————————————————————————————解析:正确答案:D————————————————————————————————————————解析:森林与二叉树具有对应关系,因此,我们存储森林时应先将森林转换......
  • 最简最速!C++版OpenCV安装配置教程Win/Mac!!!
    Clion+OpenCV(C++版)开发环境配置教程Win/Mac        平时在学习和比赛的时候都是使用的Python版本的OpenCV,最近遇到了一个项目使用的上位机性能有限于是决定视觉方面使用C++的OpenCV来节约上位机资源提高运行的速度,在查阅了网上的各种资料后发现这些资料参差不齐......