opencv-22 图像几何变换01-缩放-cv2.resize()(图像增强,图像变形,图像拼接)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

什么是几何变换

几何变换是计算机图形学中的一种图像处理技术用于对图像进行空间上的变换而不改变图像的内容。这些变换可以通过对图像中的像素位置进行调整来实现。

常见的几何变换包括

平移Translation将图像在水平和/或垂直方向上进行平移即将图像的每个像素沿着指定的距离进行移动。

缩放Scaling通过增大或减小图像的尺寸使图像变得更大或更小。在缩放过程中图像中的每个像素的位置会相应地调整。

旋转Rotation将图像绕着一个特定的旋转中心进行旋转使得图像的内容按照指定的角度进行旋转。

翻转Flip将图像在水平和/或垂直方向上进行翻转即将图像的像素按照指定的方向进行镜像反转。

剪切Shearing在某个方向上将图像的一部分像素按照一定的比例进行平移使得图像在该方向上发生错切效果。

几何变换的应用场景

几何变换在计算机图形学和计算机视觉领域有广泛的应用场景。以下是一些常见的几何变换的应用场景

图像配准Image Registration在医学影像、遥感图像等领域需要将多幅图像进行对齐使得它们在空间上对应的位置一致。几何变换可以用于实现图像的平移、旋转和缩放从而实现图像的配准。

图像增强Image Enhancement在图像增强中几何变换可以用于调整图像的尺寸和位置使得图像在显示或处理时更合适。比如将图像缩放到指定大小或者对图像进行裁剪。

视觉效果和动画在计算机游戏、动画制作等领域几何变换可以用于实现图像或物体的平移、旋转和缩放从而创建出各种视觉效果和动画。

图像变形Image Warping图像变形是指将图像的某些区域按照一定的规则进行变形从而实现特定的效果如人脸变形、风格化效果等。

2D到3D的转换在计算机辅助设计CAD和虚拟现实VR中几何变换可以用于将2D图像转换成3D模型或场景。

视角变换Viewpoint Transformation在计算机视觉中几何变换可以用于将图像从不同视角进行观察从而对图像进行重建、分析或识别。

图像拼接Image Stitching将多幅图像拼接成一幅全景图时需要进行图像的平移、旋转和缩放等几何变换以使得不同图像之间能够无缝地对齐。

总的来说几何变换在图像处理和计算机图形学中起着至关重要的作用它们能够改变图像的位置和形状从而实现图像的对齐、增强、变形和合成等多种功能。

以下对几个常用的图像变换操作进行单独分析

缩放

在 OpenCV 中使用函数 cv2.resize()实现对图像的缩放该函数的具体形式为

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

式中
 dst 代表输出的目标图像该图像的类型与 src 相同其大小为 dsize当该值非零时
或者可以通过 src.size()、fx、fy 计算得到。
 src 代表需要缩放的原始图像。
 dsize 代表输出图像大小。
 fx 代表水平方向的缩放比例。
 fy 代表垂直方向的缩放比例。
 interpolation 代表插值方式具体如表 5-1 所示。

在这里插入图片描述
在这里插入图片描述

在 cv2.resize()函数中目标图像的大小可以通过“参数 dsize”或者“参数 fx 和 fy”二者之一来指定具体介绍如下。

 情况 1通过参数 dsize 指定
如果指定参数 dsize 的值则无论是否指定了参数 fx 和 fy 的值都由参数 dsize 来决定目
标图像的大小。
此时需要注意的是dsize 内第 1 个参数对应缩放后图像的宽度width即列数 cols与参数 fx 相关第 2 个参数对应缩放后图像的高度height即行数 rows与参数 fy 相关。
指定参数 dsize 的值时x 方向的缩放大小参数 fx为

(double)dsize.width/src.cols

同时y 方向的缩放大小参数 fy为

(double)dsize.height/src.rows

情况 2通过参数 fx 和 fy 指定

如果参数 dsize 的值是 None那么目标图像的大小通过参数 fx 和 fy 来决定。此时目标图像的大小为

dsize=Size(round(fx*src.cols),round(fy*src.rows))

插值是指在对图像进行几何处理时给无法直接通过映射得到值的像素点赋值。

例如将图像放大为原来的 2 倍必然会多出一些无法被直接映射值的像素点对于这些像素点插值方式决定了如何确定它们的值。

除此以外还会存在一些非整数的映射值例如反向映射可能会把目标图像中的像素点值映射到原始图像中的非整数值对应的位置上当然原始图像内是不可能存在这样的非整数位置的即目标图像上的该像素点不能对应到原始图像的某个具体位置上此时也要对这些像素点进行插值处理以完成映射。

函数 cv2.resize()能实现对原始图像的缩放功能需要注意的是开始运算前操作前的目标图像 dst 自身的大小、类型与最终得到的目标图像 dst 是没有任何关系的。
目标图像 dst 的最终大小和类型是通过 src、dsize、fx、fy 指定的。如果想让原始图像调整为和目标图像一样大
则必须通过上述属性指定。

当缩小图像时使用区域插值方式INTER_AREA能够得到最好的效果
当放大图像时使用三次样条插值INTER_CUBIC方式和双线性插值INTER_LINEAR方式都能够取得较好的效果。
三次样条插值方式速度较慢双线性插值方式速度相对较快且效果并不逊色。

实验使用函数 cv2.resize()对一个数组进行简单缩放

import cv2
import numpy as np
img=np.ones([2,4,3],dtype=np.uint8)
#获取图像的尺寸
size=img.shape[:2]
print("size=\n",size)
#缩放图像
rst=cv2.resize(img,size)

print("img.shape=\n",img.shape)
print("img=\n",img)
print("rst.shape=\n",rst.shape)
print("rst=\n",rst)

在本例中我们期望通过函数 cv2.resize()对原始图像进行缩放。为了方便观察将目标图像设置为与原始图像等大小
运行结果

size=
 (2, 4)
img.shape=
 (2, 4, 3)
img=
 [[[1 1 1]
  [1 1 1]
  [1 1 1]
  [1 1 1]]

 [[1 1 1]
  [1 1 1]
  [1 1 1]
  [1 1 1]]]
rst.shape=
 (4, 2, 3)
rst=
 [[[1 1 1]
  [1 1 1]]

 [[1 1 1]
  [1 1 1]]

 [[1 1 1]
  [1 1 1]]

 [[1 1 1]
  [1 1 1]]]

通过程序我们观察到我们的目的没有达到目标图像的大小与原始图像的大小并不一致。
原始图像的大小是 2 行 4 列目标图像的大小是 4 行 2 列

 目标图像的行数是原始图像的列数。
 目标图像的列数是原始图像的行数。

通过以上例题我们进一步确认函数 cv2.resize()内 dsize 参数与图像 shape 属性在行、列的顺序上是不一致的或者说
 在 shape 属性中第 1 个值对应的是行数第 2 个值对应的是列数。
 在 dsize 参数中第 1 个值对应的是列数第 2 个值对应的是行数。
我们通常使用等大小的图像进行测试在这种情况下可能无法发现 cv2.resize()函数内 dsize 参数的具体使用方式。
在使用 cv2.resize()函数时要额外注意参数 dsize 的属性顺序问题

实验2使用函数 cv2.resize()完成一个简单的图像缩放

import cv2
img=cv2.imread("lena.png")
print(img.shape)
rows,cols=img.shape[:2]
#重置图像大小
size=(int(cols*0.9),int(rows*0.5))
rst=cv2.resize(img,size)
print("img.shape=",img.shape)
print("rst.shape=",rst.shape)

cv2.imshow("img",img)
cv2.imshow("rst",rst)

cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果

(512, 512, 3)
img.shape= (512, 512, 3)
rst.shape= (256, 460, 3)

在这里插入图片描述
从程序可以看出
 列数变为原来的 0.9 倍
 行数变为原来的 0.5 倍

实验3控制函数 cv2.resize()的 fx 参数、fy 参数完成图像缩放

import cv2
img=cv2.imread("lena.png")
print(img.shape)
rows,cols=img.shape[:2]
#重置图像大小
size=(int(cols*0.9),int(rows*0.5))

#rst=cv2.resize(img,size)

rst=cv2.resize(img,None,fx=2,fy=0.5)


print("img.shape=",img.shape)
print("rst.shape=",rst.shape)

cv2.imshow("img",img)
cv2.imshow("rst",rst)

cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果

(512, 512, 3)
img.shape= (512, 512, 3)
rst.shape= (256, 1024, 3)

在这里插入图片描述

从程序可以看出
 fx 进行的是水平方向的缩放将列数变为原来的 2 倍得到 512×2=1024。
 fy 进行的是垂直方向的缩放将行数变为原来的 0.5 倍得到 512×0.5=256。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“opencv-22 图像几何变换01-缩放-cv2.resize()(图像增强,图像变形,图像拼接)” 的相关文章