OpenCV入门学习记录---3、图像的缩放、平移、旋转、仿射变换、透射变换、图像金字塔等

举报
Pengpengpeng 发表于 2024/11/25 23:14:04 2024/11/25
【摘要】 1、图像缩放:  cv.resize() 2、图像平移:cv.warpAffine() 3、图像旋转:cv.getRotationMatrix2D,cv.warpAffine() 4、仿射变换:cv.getAffineTransform,cv.warpAffine() 5、透射变换:cv.getPerspectiveTransform(),cv.warpPersective() 6、图像金字塔

3.1 图像的缩放--------缩放是指对图像的大小进行调整,即图像的放大或缩小

API :  cv.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)        

cv.resize() 函数通过指定的插值方法来计算新图像中每个像素的值。插值方法的选择会影响图像缩放后的质量。

参数解释:

  • src:输入图像。
  • dsize:目标图像的大小,以 (width, height) 的形式给出。如果 dsizeNone,则 fxfy 必须被指定。
  • fx:沿图像宽度的缩放因子;如果 fxfy 为0,则 dsize 必须被指定。
  • fy:沿图像高度的缩放因子;如果 fxfy 为0,则 dsize 必须被指定。
  • interpolation:插值方法,用于计算新图像中像素的值。OpenCV 提供了多种插值方法,包括:
    • cv2.INTER_NEAREST:最近邻插值。
    • cv2.INTER_LINEAR:双线性插值(默认)。
    • cv2.INTER_CUBIC:双三次插值。
    • cv2.INTER_AREA:区域插值,适用于图像缩小。

用绝对尺寸进行缩放:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

nv = cv.imread("/home/pengsongjie/mydrive/image/nv1")  #先载入图像,原始图像是(935*678)

plt.imshow(nv[:,:,::-1])

#绝对尺寸
rows,cols = nv.shape[:2]

res = cv.resize(nv,(2*cols,2*rows)) #注意:在 OpenCV 中,图像通常以 NumPy 数组的形式存储,而 NumPy 数组的索引顺序是先列后行。括号里的参数必须先写宽度(列数),再写高度(行数)

plt.imshow(res[:,:,::-1]) #放大后图像为1870*1356


用相对尺寸进行缩放:

res1 = cv.resize(nv,None,fx=0.5,fy=0.5)

plt.imshow(res1[:,:,::-1])#图片缩成了468*339

3.2 图像平移--------图像平移将图像按照指定方向和距离移到相应的位置

API :   CV.warpAffine(src,M,dsize)

cv.warpAffine() 是 OpenCV 库中的一个函数,用于对图像进行仿射变换。仿射变换是一种保持图像中点、直线和平面之间相对位置不变的线性变换,它可以包括旋转、平移、缩放和倾斜等操作。

参数解释:

  • src:输入图像。
  • M:变换矩阵,是一个 2x3 的矩阵,表示仿射变换。
  • dsize:输出图像的大小,以 (width, height) 的形式给出。

先定义矩阵

M = np.float32([[1,0,50],[0,1,100]])  #这行代码创建了一个 2x3 的 NumPy 数组,并且将数组中的所有元素转换为 float32 类型。这个数组 M 通常用作仿射变换矩阵

res2 = cv.warpAffine(nv,M,(cols,rows))

plt.imshow(res2[:,:,::-1])

放大画布大小

res3 = cv.warpAffine(nv,M,(2*cols,2*rows))

plt.imshow(res3[:,:,::-1])

3.3 图像旋转--------按照某个位置转动一定角度,旋转中图像尺寸不变

API :   cv.getRotationMatrix2D(center,angle,scale)

用于计算给定旋转中心、旋转角度和缩放因子的 2D 旋转矩阵。这个函数经常用于图像的旋转操作,它返回的矩阵可以直接用于 cv.warpAffine() 函数来执行旋转。

参数解释:

  • center:旋转中心,通常是一个 (x, y) 坐标对,表示图像中旋转应该围绕的点。
  • angle:旋转角度,以度为单位。正值表示逆时针旋转,负值表示顺时针旋转。
  • scale:缩放因子,用于在旋转的同时对图像进行缩放。如果设置为 1,则图像仅旋转不缩放。

先定义旋转矩阵:

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

用cv.warpAffine()函数执行旋转:

res3 = cv.warpAffine(nv,M,(cols,rows))

显示图像:

plt.imshow(res3[:,:,::-1])

3.4 仿射变换--------涉及到图像的形状位置角度的变化,是深度学习预处理中常用到的功能

仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合

API :   cv.getAffineTransform(pts1,pts2)

cv.getAffineTransform() 是 OpenCV 库中的一个函数,它用于计算两个平面之间的仿射变换矩阵。仿射变换是一种保持共线性和距离比的几何变换,它可以包括旋转、平移、缩放和剪切等操作。

首先构建仿射前后对应点的位置:

pts1 = np.float32([[50,50],[200,50],[50,200]])

pts2 = np.float32([[100,100],[200,50],[100,250]])

构建变换矩阵:

M = cv.getAffineTransform(pts1,pts2)

用cv.warpAffine()函数执行仿射:

res4 = cv.warpAffine(nv,M,(cols,rows))

显示图像:

plt.imshow(res4[:,:,::-1])

3.5 透射变换--------利用透视中心、像点、目标点三点共线的条件,按透射旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换

API :   cv.getPerspectiveTransform()

cv.getPerspectiveTransform() 是 OpenCV 中用于计算透视变换矩阵的函数。这个函数根据给定的源图像中的四个点的坐标和目标图像中对应的四个点的坐标,计算出一个 3x3 的透视变换矩阵。这个矩阵可以应用于源图像,以实现从源四边形到目标四边形的透视变换。

首先构建原图和透射变换后对应的四个点位置:

pst1 = np.float32([[56,65],[368,52],[28,387],[389,390]])

pst2 = np.float32([[100,145],[300,100],[80,290],[310,300]])

接着构建透射矩阵:

M = cv.getPerspectiveTransform(pst1,pst2)

用cv.warpPerspective()执行透射:

res5 = cv.warpPerspective(nv,M,(cols,rows))

显示图像:

plt.imshow(res5[:,:,::-1])

3.6 图像金字塔--------图像多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构

图像金字塔(Image Pyramid)是一种图像处理和计算机视觉中常用的数据结构,它将一系列不同分辨率的图像组织起来,每个级别都是上一个级别的缩小版。图像金字塔可以用于多种目的,包括图像分析、特征提取、图像压缩和多尺度处理等。

API : cv.pyrUp(img)    #对图像进行上采样

cv2.pyrUp() 是 OpenCV 库中的一个函数,用于对图像进行上采样(放大),通常是在构建图像金字塔的过程中使用。这个函数将图像的尺寸增加大约一倍,并且使用高斯插值来平滑图像,以减少放大时可能出现的混叠效应。

         cv.pyrDown(img)   #对图像进行下采样

cv2.pyrDown() 是 OpenCV 中用于实现高斯金字塔下采样的函数。其主要作用是对图像进行高斯平滑处理后进行降采样,通常是将图像的尺寸减半,以达到降低分辨率的效果。


首先先看一下原始图像的尺寸:

进行上采样:

进行下采样:


总结:

1、图像缩放:对图像进行放大或缩小  cv.resize()

2、图像平移:指定平移矩阵后,调用cv.warpAffine()平移图像

3、图像旋转:调用cv.getRotationMatrix2D获取旋转矩阵,然后调用cv.warpAffine()进行旋转

4、仿射变换:调用cv.getAffineTransform创建变换矩阵,然后调用cv.warpAffine()平移图像

5、透射变换:调用cv.getPerspectiveTransform()创建变换矩阵,然后调用cv.warpPersective()透射变换

6、金字塔:cv.pyrUp(img)    #对图像进行上采样             cv.pyrDown(img)   #对图像进行下采样


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。