南昌网站建设专业公司,伪装的福祉 wordpress,互助资金盘网站开发,wordpress主题表单功能几何变换指的是将一幅图像映射到另一幅图像内的操作。
cv2.warpAffine#xff1a;使用仿射变换矩阵对图像进行变换#xff0c;可以实现平移、缩放和旋转等操作。cv2.warpPerspective#xff1a;使用透视变换矩阵对图像进行透视变换#xff0c;可以实现镜头校正、图像纠偏等…几何变换指的是将一幅图像映射到另一幅图像内的操作。
cv2.warpAffine使用仿射变换矩阵对图像进行变换可以实现平移、缩放和旋转等操作。cv2.warpPerspective使用透视变换矩阵对图像进行透视变换可以实现镜头校正、图像纠偏等操作。cv2.getAffineTransform计算仿射变换矩阵根据输入的三个点对之间的关系来生成一个2x3的矩阵。cv2.getPerspectiveTransform计算透视变换矩阵根据输入的四个点对之间的关系来生成一个3x3的矩阵。cv2.resize调整图像的大小可以根据指定的尺寸或比例因子来进行缩放操作。cv2.flip对图像进行翻转操作可以在水平、垂直或两者方向上进行翻转。cv2.rotate对图像进行旋转操作可以按照指定的角度对图像进行顺时针或逆时针旋转。
这些函数可以在OpenCV中灵活使用以实现各种图像的几何变换。通过调整参数和变换矩阵可以达到所需的图像效果和变换结果。 CV 几何变换 一、缩放1.1 写法1.1 改变图像的参数dsize的值1.2通过参数 fx 和 fy 指定1.3什么是插值部分介绍 二、翻转2.1 语句 ycv2.flip(img,1) 会使图像绕着 y 轴进行翻转。2.2 语句 xycv2.flip(img,-1) 会使图像同时绕着 x 轴和 y 轴进行翻转。2.3 语句 xcv2.flip(img,0) 会使图像绕着 x 轴进行翻转。 三、仿射变换3.1 平移3.1.1 代码及效果3.1.2 平移再缩放 3.2 旋转3.2.1 代码及效果 3.3 cv2.getAffineTransform计算仿射变换矩阵3.3.1 代码 四、透视4.1 cv2.getPerspectiveTransform() 转换矩阵4.2 代码及效果 五、重映射5.1 复制5.2 翻转5.2.1 绕着x轴5.2.2 绕y轴翻转5.2.3 绕x轴、y轴翻转5.2.4 x轴、y轴互换 5.3 图像缩放 一、缩放
dst cv2.resize( src, dsize[, fx[, fy[, interpolation]]] ) dst 代表输出的目标图像该图像的类型与 src 相同其大小为 dsize当该值非零时或者可以通过 src.size()fx、fy 计算得到。 src 代表需要缩放的原始图像。 dsize 代表输出图像大小。 fx 代表水平方向的缩放比例。 fy 代表垂直方向的缩放比例。 interpolation 代表插值方式 1.1 写法
# 指定目标尺寸
resized_image cv2.resize(image, (new_width, new_height))# 指定缩放比例因子
resized_image cv2.resize(image, None, fxscale_factor, fyscale_factor)# 指定目标尺寸和插值方法
resized_image cv2.resize(image, (new_width, new_height), interpolationcv2.INTER_NEAREST)
原图
1.1 改变图像的参数dsize的值
无论有fx,fy,都是由于dszie决定目标图像的大小,colws,rows
fx(double)dsize.width/src.cols
fy(double)dsize.height/src.rows1.2通过参数 fx 和 fy 指定
dsize的值为None通过目标的参数fxfy来实现的。 dsize(round(fx*src.cols),round(fy*src.rows)) 1.3什么是插值
几何变换如调整大小期间确定无法直接映射的像素点值的必要性。当你放大图像时会引入一些在原始图像中没有相应值的新像素。插值方法用于估算这些新像素的值。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img1cv.imread(./Pic/test_img.jpg)
rows,colsimg1.shape[:2]
print(rows)
print(cols)部分介绍 最近邻插值最近邻插值方法会选择最接近目标像素位置的原始像素的值作为新像素的值。这种方法计算简单但可能会导致图像的锯齿状边缘和失真。 双线性插值双线性插值方法会根据目标像素位置周围的四个最近原始像素的值进行加权平均以计算新像素的值。这种方法可以产生较平滑的图像但可能会导致细节的模糊。 双三次插值双三次插值方法会根据目标像素位置周围的16个最近原始像素的值进行加权平均以计算新像素的值。这种方法可以产生更平滑的图像但计算复杂度较高。
选择哪种插值方法取决于应用的需求。如果需要保留图像的细节和边缘可以选择双线性或双三次插值。如果需要快速计算并可以容忍一些失真可以选择最近邻插值。
总之插值方法在图像缩放中起着重要的作用可以影响图像质量和计算效率。根据具体需求选择适当的插值方法是很重要的。
二、翻转 在图像处理中旋转和翻转是两种不同的操作。 · 旋转 意味着围绕图像的中心或其他指定点按某个角度旋转图像。这会导致图像内容的重组但不会改变内容本身的方向。在 OpenCV 中你可以使用 cv2.rotate 函数来旋转图像。 · 翻转 意味着以水平或垂直轴为对称轴来颠倒图像内容。水平翻转会使图像左右颠倒而垂直翻转则会使图像上下颠倒。在 OpenCV 中你可以使用 cv2.flip 函数来实现图像的翻转。 · 总结来说旋转是根据一个角度来调整图像的方向而翻转是基于图像的对称轴来颠倒图像内容。 dst cv2.flip( src, flipCode )
#src 代表了原始像素点源像素dst 代表了目标像素点目标像素
dst 代表和原始图像具有同样大小、类型的目标图像。
src 代表要处理的原始图像。
flipCode 翻转的方式水平翻转、垂直翻转或同时进行水平和垂直翻转
2.1 语句 ycv2.flip(img,1) 会使图像绕着 y 轴进行翻转。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
imgxcv.imread(./Pic/test_img.jpg)
dstcv.flip(imgx,1)
plt.imshow(dst[:,:,::-1])2.2 语句 xycv2.flip(img,-1) 会使图像同时绕着 x 轴和 y 轴进行翻转。
dstcv.flip(imgx,-1)
plt.imshow(dst[:,:,::-1])2.3 语句 xcv2.flip(img,0) 会使图像绕着 x 轴进行翻转。
dstcv.flip(imgx,0)
plt.imshow(dst[:,:,::-1])三、仿射变换
仿射变换是一种线性变换可以通过矩阵的乘法来描述。这种变换在保持图像中的平行性和直线性方面非常强大因此在图像处理和计算机视觉领域得到广泛应用。它能够实现平移、旋转、缩放和剪切等操作并且在变换后仍然能够保持空间关系的几何特性。
dst cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]] )
src: 输入图像即需要进行仿射变换的图像。M: 变换矩阵描述了平移、旋转和缩放等操作。dsize: 输出图像的大小即变换后的图像的尺寸。flags: 插值方法的标志。用于指定在变换过程中如何对像素进行插值。这是可选参数。borderMode: 边界模式指定了当像素越界时的处理方式例如镜像、填充等。这也是一个可选参数。borderValue: 当使用常量边界模式时指定边界填充的数值。这同样是一个可选参数。
在运用中就简化成 dst cv2.warpAffine( src , M , dsize )
3.1 平移
平移是一种基本的仿射变换操作它将图像沿着给定的方向进行移动。 【图像平移将图像按照指定方向和距离移动到相应的位置】
M | 1 0 tx || 0 1 ty |在这里tx 和 ty 分别表示沿 x 和 y 方向的平移量。当应用这个平移矩阵时图像中的每个像素将按照指定的偏移量进行移动。
只需提供适当的变换矩阵可以很容易地实现图像的平移操作 dst cv2.warpAffine( src , M , dsize )
img:输入图像 M: 2*3移动矩阵注意将M设置为np.float32类型的Numpy数组。)
dsize:输出图像的大小注意:输出图像的大小,它应该是(宽度,高度)的形式。请记住,width列数, height行数。
3.1.1 代码及效果
import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltimg1 cv.imread(./Pic/test_img.jpg)# 平移
rows, cols img1.shape[:2]
M np.float32([[1, 0, 100], [0, 1, 50]])
dst cv.warpAffine(img1, M, (cols, rows))# 显示
fig, axes plt.subplots(1, 2, figsize(12, 6))axes[0].imshow(cv.cvtColor(img1, cv.COLOR_BGR2RGB))
axes[0].set_title(Original)axes[1].imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB))
axes[1].set_title(Change)
plt.show() 3.1.2 平移再缩放
更改dsize的大小
3.2 旋转
retvalcv2.getRotationMatrix2D(center, angle, scale) 在这里cv2.getRotationMatrix2D()函数用于生成一个旋转矩阵其参数的含义如下 center旋转的中心点坐标通常以元组 (x, y) 的形式表示。在图像处理中(0, 0) 通常代表图像的左上角。 angle旋转角度以度为单位。正数表示逆时针旋转负数表示顺时针旋转。 scale可选的缩放因子。如果不需要对图像进行缩放可以将其设置为1。如果想要按比例缩放图像可以提供缩放因子。
该函数返回一个2x3的变换矩阵将它应用到原始图像上可以实现指定中心点、角度和缩放比例的旋转。
3.2.1 代码及效果
import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltimg cv.imread(./Pic/test_img.jpg)# 获取图像尺寸
rows, cols img.shape[:2]# 旋转角度为90度
theta 90
theta_rad np.deg2rad(theta)# 构造旋转矩阵
M cv.getRotationMatrix2D((cols / 2, rows / 2), theta, 1)# 进行图像旋转
dst cv.warpAffine(img, M, (cols, rows))# 显示图像
fig, axes plt.subplots(1, 2, figsize(12, 6))
axes[0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
axes[0].set_title(Original)axes[1].imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB))
axes[1].set_title(Rotated)
plt.show() M cv.getRotationMatrix2D((cols/ 2, rows / 2), 45, 0.5)3.3 cv2.getAffineTransform计算仿射变换矩阵
retvalcv2.getAffineTransform(src, dst)
src 代表输入图像的三个点坐标。 dst 代表输出图像的三个点坐标。
3.3.1 代码
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
x1, y1 100, 100
x2, y2 200, 300
x3, y3 100, 200u1, v1 150, 150
u2, v2 250, 150
u3, v3 150, 250img cv.imread(./Pic/test_img.jpg)# 获取图像尺寸
rows, cols img.shape[:2]# 定义原始图像上的三个点和目标图像上的三个对应点
pts_original np.float32([[x1, y1], [x2, y2], [x3, y3]])
pts_target np.float32([[u1, v1], [u2, v2], [u3, v3]])# 获取仿射变换矩阵
M cv.getAffineTransform(pts_original, pts_target)# 进行仿射变换
dst cv.warpAffine(img, M, (cols, rows))# 显示图像
fig, axes plt.subplots(1, 2, figsize(12, 6))
axes[0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
axes[0].set_title(Original)axes[1].imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB))
axes[1].set_title(Transformed)
plt.show()四、透视
dst cv2.warpPerspective( src, M, dsize[, flags[, borderMode[, borderValue]]] ) cv2.warpPerspective()函数用于执行透视变换它接受以下参数 src: 输入图像。这是要进行透视变换的原始图像。 M: 变换矩阵。这是通过cv2.getPerspectiveTransform()或其他类似函数计算得到的透视变换矩阵。 dsize: 输出图像的大小表示为 (width, height)。 flags可选参数: 这是一个插值方法的标志用于指定如何在变换过程中对图像进行插值。默认情况下为cv2.INTER_LINEAR这意味着使用线性插值。其他可能的值包括cv2.INTER_NEAREST最近邻插值、cv2.INTER_CUBIC立方插值等。 borderMode可选参数: 用于定义边界像素的模式。默认为cv2.BORDER_CONSTANT表示将边界填充为常数值。其他可能的值包括cv2.BORDER_REFLECT边界像素的镜像反射和cv2.BORDER_WRAP边界像素的重复等。 borderValue可选参数: 当borderMode为cv2.BORDER_CONSTANT时可以指定边界填充的常数值。默认为0。
4.1 cv2.getPerspectiveTransform() 转换矩阵
可以使用函数 cv2.getPerspectiveTransform() 生成适用于 cv2.warpPerspective() 的转换矩阵。该函数的语法格式为
retval cv2.getPerspectiveTransform(src, dst)其中参数含义如下 src代表输入图像的四个顶点的坐标。 dst代表输出图像的四个顶点的坐标。
需要注意的是src 参数和 dst 参数都是包含四个点的数组与仿射变换函数 cv2.getAffineTransform() 中的三个点是不同的。在实际使用中我们可以根据需求控制 src 中的四个点映射到 dst 中的四个点。
4.2 代码及效果
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 定义原始图像上的四个点和目标图像上的四个对应点
src_points np.float32([[100, 100], [200, 300], [100, 200], [300, 150]])
dst_points np.float32([[150, 150], [250, 150], [150, 250], [300, 200]])img cv.imread(./Pic/test_img.jpg)# 获取透视变换矩阵
M cv.getPerspectiveTransform(src_points, dst_points)# 进行透视变换
dst cv.warpPerspective(img, M, (img.shape[1], img.shape[0]))# 显示图像
fig, axes plt.subplots(1, 2, figsize(12, 6))
axes[0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
axes[0].set_title(Original)axes[1].imshow(cv.cvtColor(dst, cv.COLOR_BGR2RGB))
axes[1].set_title(Transformed)
plt.show() 五、重映射
重映射是指将图像中的像素从一个位置映射到另一个位置的过程。在计算机视觉和图像处理中重映射通常用于图像几何变换如旋转、缩放、仿射变换、透视变换等以及校正畸变等操作。
在重映射过程中我们需要定义一个映射关系将输入图像中的每个像素映射到输出图像中的相应位置。这个映射关系可以通过变换矩阵如仿射变换矩阵或透视变换矩阵来实现也可以通过自定义的像素级映射函数来完成。一旦建立了映射关系就可以根据该关系对图像进行重映射从而实现所需的变换效果。
在OpenCV中重映射通常涉及到两个主要函数cv2.remap() 和 cv2.warpAffine() 或 cv2.warpPerspective()。前者允许用户提供自定义的映射关系而后者则使用预定义的变换矩阵来执行重映射。
5.1 复制
当使用 cv2.remap() 函数来实现图像复制时我们可以通过以下步骤进行处理
创建网格首先我们需要创建一个与原始图像大小相同的网格。这个网格将用于映射坐标值。
height, width img.shape[:2]
map_x, map_y np.meshgrid(np.arange(width), np.arange(height))设置 map1 和 map2 的值接下来我们将 map1 的值设定为对应位置上的 x 轴坐标值将 map2 的值设定为对应位置上的 y 轴坐标值。
map1 map_x
map2 map_y使用 remap 函数实现图像复制将处理后的 map1 和 map2 参数传递给 cv2.remap() 函数同时指定插值方法如 cv2.INTER_LINEAR。
remapped_img cv2.remap(img, map1, map2, interpolationcv2.INTER_LINEAR)显示复制后的图像最后我们可以通过显示函数来展示复制后的图像以便观察结果。
cv2.imshow(Remapped Image, remapped_img)
cv2.waitKey(0)
cv2.destroyAllWindows()通过以上步骤我们可以利用重映射函数 cv2.remap() 来实现图像的复制。这种方法允许我们更灵活地控制图像的映射过程以实现各种类型的图像处理效果。
5.2 翻转
5.2.1 绕着x轴
在OpenCV中要实现图像绕x轴翻转需要进行以下映射过程
x坐标轴的值保持不变。y坐标轴的值以x轴为对称轴进行交换。
这反映在两个映射数组map1和map2上的变化如下
对于map1其值保持不变。对于map2需要将其值调整为“总行数-1-当前行号”。
需要注意的是在OpenCV中行号的下标是从0开始的。因此在对称关系中存在一个规律“当前行号对称行号总行数-1”。据此在绕着x轴翻转时map2中当前行的行号应调整为“总行数-1-当前行号”。
5.2.2 绕y轴翻转
要实现图像绕y轴翻转需要进行以下映射过程
y坐标轴的值保持不变。x坐标轴的值以y轴为对称轴进行交换。
这反映在两个映射数组map1和map2上的变化如下
对于map2其值保持不变。对于map1需要将其值调整为“总列数-1-当前列号”。
需要注意的是在OpenCV中列号的下标是从0开始的。因此在对称关系中存在一个规律“当前列号对称列号总列数-1”。据此在绕着y轴翻转时map1中当前列的列号应调整为“总列数-1-当前列号”。
5.2.3 绕x轴、y轴翻转
要实现图像绕x轴、y轴翻转需要进行以下映射过程
x坐标轴的值以y轴为对称轴进行交换。y坐标轴的值以x轴为对称轴进行交换。
这反映在两个映射数组map1和map2上的变化如下
对于map1需要将其值调整为“总列数-1-当前列号”。对于map2需要将其值调整为“总行数-1-当前行号”。
5.2.4 x轴、y轴互换
要实现图像的x轴、y轴互换需要进行以下映射过程
对于任意一点都需要将其x轴、y轴坐标互换。这反映在两个映射数组mapx和mapy上的变化如下
对于mapx其值调整为所在行的行号。对于mapy其值调整为所在列的列号。
需要注意的是如果行数和列数不一致上述运算可能存在值无法映射的情况。默认情况下无法完成映射的值会被处理为0。
5.3 图像缩放
上述介绍的映射都是直接完成的整数映射处理起来比较方便。在处理更复杂的问题时 就需要对行、列值进行比较复杂的运算来实现。