openCV——几何变换

几何变换

openCV中读入的图像数据是以(h,w,c)的顺序构建数据的。并且数据的类型都为uint8.通道顺序为BGR!!!

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
def cvshow(name, image):
    cv2.imshow(name, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

缩放

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zFq4UUAc-1650529848601)(attachment:image-2.png)]

cv2.resize()函数中,目标图像的大小可以通过“参数 dsize”或者“参数 fx 和 fy”二者之一来指定

  • 情况 1:通过参数 dsize 指定:如果指定参数 dsize 的值,则无论是否指定了参数 fx 和 fy 的值,都由参数 dsize 来决定目标图像的大小。dsize 内第 1 个参数对应缩放后图像的宽度(width,即列数 cols,与参数 fx 相关),第 2 个参数对应缩放后图像的高度(height,即行数 rows,与参数 fy 相关)
  • 情况 2:通过参数 fx 和 fy 指定:只需要指定缩放比例
lena = cv2.imread("lena.jpg")
print(lena.shape)
tar = cv2.resize(lena, dsize=None, fx=2, fy=0.5)
cvshow("tar", tar)
print(tar.shape)
(263, 263, 3)
(132, 526, 3)

可以看出,fx对列数变换,fy对行数变换

翻转

OpenCV 中,图像的翻转采用函数 cv2.flip()实现,该函数能够实现图像在水平方向翻转、垂直方向翻转、两个方向同时翻转:

  • dst = cv2.flip( src, flipCode )
    • dst 代表和原始图像具有同样大小、类型的目标图像
    • src 代表要处理的原始图像
    • flipCode 代表旋转类型

在这里插入图片描述

x = cv2.flip(lena, -1)
cvshow("x", x)

仿射变换

仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作

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

  • dst 代表仿射后的输出图像,该图像的类型和原始图像的类型相同。dsize 决定输出图像的实际大小
  • src 代表要仿射的原始图像
  • M 代表一个 2×3 的变换矩阵。使用不同的变换矩阵,就可以实现不同的仿射变换
  • dsize 代表输出图像的尺寸大小
  • flags 代表插值方法,默认为 INTER_LINEAR
  • borderMode 代表边类型, 默认为 BORDER_CONSTANT 。 当 该值为 BORDER_TRANSPARENT 时,意味着目标图像内的值不做改变,这些值对应原始图像内的异常
  • borderValue 代表边界值,默认是 0

忽略其可选参数后的语法格式为:dst = cv2.warpAffine( src , M , dsize )

在这里插入图片描述

平移

通过转换矩阵 M 实现将原始图像 src 转换为目标图像 dst:

  • dst(𝑥, 𝑦) = src(𝑀11𝑥 + 𝑀12𝑦 + 𝑀13, 𝑀21𝑥 + 𝑀22𝑦 + 𝑀23)

将原始图像 src 向右侧移动 100 个像素、向下方移动 200 个像素,则其对应关系为:dst (x, y) = src (x + 100, y + 200) 即:

  • dst (x, y) = src (1·x + 0·y + 100, 0·x + 1·y + 200)

所以:M11=1,M12=0,M13=100,M21=0,M22=1,M23=200

height, width = lena.shape[:2]
M = np.array([[1, 0, 50], [0, 1, 100]], np.float32)
res = cv2.warpAffine(lena, M, (height, width))
res.shape
con = np.hstack((lena, res))
cvshow("con", con)
旋转

在使用函数 cv2.warpAffine()对图像进行旋转时,可以通过函数 cv2.getRotationMatrix2D()获取转换矩阵。

retval=cv2.getRotationMatrix2D(center, angle, scale)

  • center 为旋转的中心点
  • angle 为旋转角度,正数表示逆时针旋转,负数表示顺时针旋转
  • scale 为变换尺度(缩放大小)
height, width = lena.shape[:2]
matrix = cv2.getRotationMatrix2D((height/2, width/2), 45, 0.88)
res = cv2.warpAffine(lena, matrix, (height, width))
wer = np.hstack((lena, res))
cvshow("wer", wer)

更复杂的仿射变换

对于更复杂仿射变换,OpenCV 提供了函数 cv2.getAffineTransform()来生成仿射函数 cv2.warpAffine()所使用的转换矩阵 M

retval=cv2.getAffineTransform(src, dst)

  • src 代表输入图像的三个点坐标
  • dst 代表输出图像的三个点坐标

在该函数中,其参数值 src 和 dst 是包含三个二维数组(x, y)点的数组。上述参数通过函数cv2.getAffineTransform()定义了两个平行四边形。src 和 dst 中的三个点分别对应平行四边形的左上角、右上角、左下角三个点。函数 cv2.warpAffine()以函数 cv2.getAffineTransform()获取的转换矩阵 M 为参数,将 src 中的点仿射到 dst 中。函数 cv2.getAffineTransform()对所指定的点完成映射后,将所有其他点的映射关系按照指定点的关系计算确定。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV中的仿射变换是一种对图像进行线性变换的方法,可以通过确定图像上的三个非共线点的位置,将原始图像变换为目标图像。首先,需要定义变换前的三个点和变换后的三个点,然后使用getAffineTransform函数计算仿射变换矩阵。最后,可以使用warpAffine函数应用仿射变换到原始图像上。 以下是一个使用OpenCV进行仿射变换的示例代码: ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main(int argc, char** argv) { Mat src, dst_affine; Point2f srcPoints = Point2f(0, 0); srcPoints = Point2f(src.cols - 1, 0); srcPoints = Point2f(0, src.rows - 1); // 变换后的三个点坐标 dstPoints = Point2f(0, src.rows*0.5); dstPoints = Point2f(src.cols*0.8, src.rows*0.2); dstPoints = Point2f(src.cols*0.2, src.rows*0.9); // 计算仿射变换矩阵 Mat M = getAffineTransform(srcPoints, dstPoints); // 应用仿射变换到原始图像 warpAffine(src, dst_affine, M, src.size()); namedWindow("Affine Transformation"); imshow("Affine Transformation", dst_affine); waitKey(0); return 0; } ``` 此代码加载图像,定义了变换前的三个点和变换后的三个点的坐标,然后使用getAffineTransform函数计算仿射变换矩阵M。最后,使用warpAffine函数将变换应用到原始图像上,并显示结果图像。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [opencv——几何变换原理与实现](https://blog.csdn.net/qq_44386034/article/details/125637881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值