【OpenCV3】图像的翻转、图像的旋转、仿射变换之图像平移、仿射变换之获取变换矩阵、透视变换

1 图像的放大与缩小
2 图像的翻转
3 图像的旋转
4 仿射变换之图像平移
5 仿射变换之获取变换矩阵
6 透视变换

1 图像的放大与缩小

  • resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

    • src: 要缩放的图片
    • dsize: 缩放之后的图片大小, 元组和列表表示均可.
    • dst: 可选参数, 缩放之后的输出图片
    • fx, fy: x轴和y轴的缩放比, 即宽度和高度的缩放比.
    • interpolation: 插值算法, 主要有以下几种:
      • INTER_NEAREST, 邻近插值, 速度快, 效果差.
      • INTER_LINEAR, 双线性插值, 使用原图中的4个点进行插值. 默认.
      • INTER_CUBIC, 三次插值, 原图中的16个点.
      • INTER_AREA, 区域插值, 效果最好, 计算时间最长.
import cv2  # 导入OpenCV库,用于图像处理
import numpy as np  # 导入NumPy库,用于处理数组操作

# 读取图片文件,将它们分别加载到变量dog和cat中
dog = cv2.imread('./dog.jpeg')  # 加载狗的图像
cat = cv2.imread('./cat.jpeg')  # 加载猫的图像

# 打印图像的形状,确保正确加载图像,并了解它们的尺寸
print(dog.shape)  # 输出:狗的图像尺寸 (360, 499, 3) - 3代表RGB通道
print(cat.shape)  # 输出:猫的图像尺寸 (480, 640, 3) - 3代表RGB通道

# 将猫的图像调整为与狗的图像相同的大小
new_cat = cv2.resize(cat, (499, 360))  # 将猫的图像大小缩放至 (499, 360)

# 使用不同的插值方法将狗的图像缩放到800x800像素
# # 1. 最近邻插值(INTER_NEAREST):这是最简单的插值方法,直接选择最近的像素。通常会导致图像有较大的像素块感。
# new_dog1 = cv2.resize(dog, (800, 800), interpolation=cv2.INTER_NEAREST)

# # 2. 双线性插值(INTER_LINEAR):常用的插值方法,考虑周围的像素并计算加权平均值。缩放效果较平滑,适用于图像放大。
# new_dog2 = cv2.resize(dog, (800, 800), interpolation=cv2.INTER_LINEAR)

# # 3. 三次插值(INTER_CUBIC):相比于双线性插值更复杂的插值算法,使用16个周围的像素来计算新的像素值,图像放大时更平滑,但速度较慢。
# new_dog3 = cv2.resize(dog, (800, 800), interpolation=cv2.INTER_CUBIC)

# # 4. 像素区域关系重采样(INTER_AREA):通常用于缩小图像,通过考虑像素区域的平均值来生成新的像素,适合于图像缩小时使用。
# new_dog4 = cv2.resize(dog, (800, 800), interpolation=cv2.INTER_AREA)

# 打印缩放后的猫图像的数据(可以删除此行,除非需要调试)
# print(new_cat)  # 这会输出图像的像素矩阵值

# 将狗和猫的图像水平拼接在一起并显示
cv2.imshow('new_cat', np.hstack((dog, new_cat)))  # np.hstack水平拼接两个图像
cv2.waitKey(0)  # 等待用户按任意键后继续(以显示窗口)
cv2.destroyAllWindows()  # 关闭所有打开的窗口

2 图像的翻转

  • flip(src, flipCode)
    • flipCode =0 表示上下翻转
    • flipCode >0 表示左右翻转
    • flipCode <0 上下 + 左右
# 翻转
import cv2
import numpy as np

#导入图片
dog = cv2.imread('./dog.jpeg')

new_dog = cv2.flip(dog, flipCode=-1)
cv2.imshow('dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

3 图像的旋转

  • rotate(img, rotateCode)
    • ROTATE_90_CLOCKWISE 90度顺时针
    • ROTATE_180 180度
    • ROTATE_90_COUNTERCLOCKWISE 90度逆时针
# 旋转
import cv2
import numpy as np

#导入图片
dog = cv2.imread('./dog.jpeg')

new_dog = cv2.rotate(dog, rotateCode=cv2.cv2.ROTATE_90_COUNTERCLOCKWISE)
cv2.imshow('dog', new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

4 仿射变换之图像平移

  • 仿射变换是图像旋转, 缩放, 平移的总称.具体的做法是通过一个矩阵和和原图片坐标进行计算, 得到新的坐标, 完成变换. 所以关键就是这个矩阵.

  • warpAffine(src, M, dsize, flags, mode, value)

  • M:变换矩阵

  • dsize: 输出图片大小

  • flag: 与resize中的插值算法一致

  • mode: 边界外推法标志

  • value: 填充边界值

  • 平移矩阵

    • 矩阵中的每个像素由(x,y)组成,(x, y)表示这个像素的坐标. 假设沿x轴平移 t x t_x tx​​​​​​​​, 沿y轴平移 t y t_y ty​​​​​​​, 那么最后得到的坐标为 ( x ^ , y ^ ) = ( x + t x , y + t y ) (\hat x, \hat y) = (x + t_x, y + t_y) (x^,y^)=(x+tx,y+ty)​​​​, 用矩阵表示就是:

在这里插入图片描述

# 仿射变换之平移
import cv2
import numpy as np

#导入图片
dog = cv2.imread('./dog.jpeg')

h, w, ch = dog.shape
M = np.float32([[1, 0, 100], [0, 1, 0]])
# 注意opencv中是先宽度, 再高度
new = cv2.warpAffine(dog, M, (w, h))

cv2.imshow('new', new)
cv2.waitKey(0)
cv2.destroyAllWindows()

5 仿射变换之获取变换矩阵

仿射变换的难点就是计算变换矩阵, OpenCV提供了计算变换矩阵的API

  • getRotationMatrix2D(center, angle, scale)
    • center 中心点 , 以图片的哪个点作为旋转时的中心点.
    • angle 角度: 旋转的角度, 按照逆时针旋转.
    • scale 缩放比例: 想把图片进行什么样的缩放.
# 仿射变换之平移
import cv2
import numpy as np

#导入图片
dog = cv2.imread('./dog.jpeg')

h, w, ch = dog.shape
# M = np.float32([[1, 0, 100], [0, 1, 0]])

# 注意旋转的角度为逆时针.
# M = cv2.getRotationMatrix2D((100, 100), 15, 1.0)
# 以图像中心点旋转
M = cv2.getRotationMatrix2D((w/2, h/2), 15, 1.0)
# 注意opencv中是先宽度, 再高度
new = cv2.warpAffine(dog, M, (w, h))

cv2.imshow('new', new)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • getAffineTransform(src[], dst[]) 通过三点可以确定变换后的位置, 相当于解方程, 3个点对应三个方程, 能解出偏移的参数和旋转的角度.

    • src原目标的三个点

    • dst对应变换后的三个点

请添加图片描述

import cv2
import numpy as np

# 导入图片
dog = cv2.imread('./dog.jpeg')  # 使用cv2.imread读取图片

# 获取图片的高度(h),宽度(w),以及通道数(ch)
h, w, ch = dog.shape

# 定义原始图片中用于仿射变换的三个顶点坐标
# 这三个点是仿射变换之前的点,指定用于计算仿射变换矩阵
src = np.float32([[20, 10], [30, 10], [20, 30]])

# 定义变换后目标图片中对应的三个顶点坐标
# 这些点是原始图片中的三个点在仿射变换后的位置
dst = np.float32([[10, 15], [36, 20], [28, 10]])

# 计算仿射变换矩阵
# cv2.getAffineTransform会根据src和dst的点计算出2x3的仿射变换矩阵M
M = cv2.getAffineTransform(src, dst)

# 对原图像进行仿射变换
# cv2.warpAffine使用仿射变换矩阵M对图片进行仿射变换,输出图片大小为原图的宽(w)和高(h)
new_dog = cv2.warpAffine(dog, M, (w, h))

# 显示仿射变换后的图片
cv2.imshow('new_dog', new_dog)

# 等待键盘事件
cv2.waitKey(0)  # 等待按键事件,0表示无限等待
cv2.destroyAllWindows()  # 关闭所有窗口

6 透视变换

透视变换就是将一种坐标系变换成另一种坐标系. 简单来说可以把一张"斜"的图变"正".

请添加图片描述

  • warpPerspective(img, M, dsize,…)

  • 对于透视变换来说, M是一个3 * 3 的矩阵.

  • getPerspectiveTransform(src, dst) 获取透视变换的变换矩阵, 需要4个点, 即图片的4个角.

import cv2
import numpy as np

# 导入图片
img = cv2.imread('./123.png')  # 使用cv2.imread读取图片
print(img.shape)  # 打印图片的尺寸信息,返回的是(高, 宽, 通道数)

# 定义源图像的四个顶点坐标
# 这些坐标是在原图像中的四个点,用于透视变换
src = np.float32([[100, 1100], [2100, 1100], [0, 4000], [2500, 3900]])

# 定义目标图像的四个顶点坐标
# 这些坐标是透视变换后图像中对应的四个点
dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]])

# 计算透视变换矩阵
# 这个矩阵将源图像的四个点映射到目标图像的四个点
M = cv2.getPerspectiveTransform(src, dst)

# 使用计算得到的透视变换矩阵进行图像变换
# cv2.warpPerspective将原图像按照透视矩阵M进行变换,输出尺寸为(2300, 3000)
new = cv2.warpPerspective(img, M, (2300, 3000))

# 创建用于显示原图的窗口,并调整窗口大小
cv2.namedWindow('img', cv2.WINDOW_NORMAL)  # 创建窗口 'img'
cv2.resizeWindow('img', 640, 480)  # 将窗口 'img' 调整为640x480

# 创建用于显示透视变换后的图像窗口,并调整窗口大小
cv2.namedWindow('new', cv2.WINDOW_NORMAL)  # 创建窗口 'new'
cv2.resizeWindow('new', 640, 480)  # 将窗口 'new' 调整为640x480

# 显示原图和透视变换后的图像
cv2.imshow('img', img)  # 显示原图
cv2.imshow('new', new)  # 显示透视变换后的图像

# 等待键盘事件
cv2.waitKey(0)  # 无限等待按键输入,0表示无限等待
cv2.destroyAllWindows()  # 关闭所有窗口

设计logo

  • 1.引入图片
  • 2.设计一个logo图片
  • 3.规划一个自己的logo,看看放哪里合适,在添加的位置变成黑色
  • 4.利用add方法,把logo和图片叠加在一起
import cv2
import numpy as np

dog = cv2.imread('./dog.jpeg')

# 创建logo
logo = np.zeros((200, 200, 3), np.uint8)

# 绘制logo
logo[20: 120, 20: 120] = [0, 0, 255]
logo[80: 180, 80: 180] = [0, 255, 0]

# 掩码
mask = np.zeros((200, 200), np.uint8)
mask[20: 120, 20: 120] = 255
mask[80: 180, 80: 180] = 255

# cv2.imshow('mask', mask)
m = cv2.bitwise_not(mask)
# cv2.imshow('m', m)

# 选择dog添加logo的位置
roi = dog[0: 200, 0: 200]

# roi与m进行与操作, mask先roi,roi做与运算
tmp = cv2.bitwise_and(roi, roi, mask=m)
# cv2.imshow('tmp', tmp)

dst = cv2.add(tmp, logo)
# cv2.imshow('dst', dst)

# 在dog上还原
dog[: 200, : 200] = dst

# cv2.imshow('logo', logo)
cv2.imshow('dog', dog)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/874565.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

秋招春招,在线测评题库包含哪些?

各位小伙伴们&#xff0c;秋招春招的号角已经吹响&#xff0c;作为HR&#xff0c;我们又要开始忙碌起来了。面对众多的候选人&#xff0c;如何高效、准确地筛选出合适的人选呢&#xff1f; 在线测评就是一个非常有用的工具。本文就说说在线测评题库里的那些事儿&#xff0c;主…

ant-design-vue中实现a-tree树形控件父子关联选中过滤的算法

在使用ant-design-vue的框架时&#xff0c;a-tree是比较常用的组件&#xff0c;比较适合处理树形结构的数据。 但是在与后台数据进行授权交互时&#xff0c;就不友好了。 在原生官方文档的例子中&#xff0c;若子项被勾选&#xff0c;则父级节点会被关联勾选&#xff0c;但这勾…

天通报警呼叫柱:为边防哨所筑起坚固的通信堡垒

一、背景 边防哨所是国家安全的重要防线&#xff0c;肩负着守护边境安全、维护国家主权和领土完整的神圣使命。由于边防哨所通常位于地理位置偏远、环境恶劣的地区&#xff0c;通信问题成为影响边防工作的重要因素&#xff0c;给边防官兵的日常工作和应急响应带来了不小的挑战…

vue3封装数字上下滚动翻牌器,

优点&#xff1a;可以传入字符串设置初始数字位数&#xff0c;也可以直接传入数字&#xff0c;让他自己根据位数渲染 组件代码&#xff1a; <template><div class"count-flop" :key"compKey"><!-- --><div:class"item ! . ?…

欺诈文本分类检测(十四):GPTQ量化模型

1. 引言 量化的本质&#xff1a;通过将模型参数从高精度&#xff08;例如32位&#xff09;降低到低精度&#xff08;例如8位&#xff09;&#xff0c;来缩小模型体积。 本文将采用一种训练后量化方法GPTQ&#xff0c;对前文已经训练并合并过的模型文件进行量化&#xff0c;通…

判断奇偶数的小妙招

要判断一个数是奇数还是偶数&#xff0c;一般首先想到的都是对2取余&#xff0c;但其实有更高明的算法。 首先咱们要知道一个知识点&#xff1a;偶数的二进制末位为0&#xff0c;奇数的二进制末位为1。 这是进位制本身的规则决定的&#xff0c;二进制是“逢二进一”。如果末位…

Docker 学习 Day 2

docker 基本命令和操作 学习视频一、docker 常用命令1、帮助启动类命令2、镜像命令2.1、docker images2.2、docker search 某个 xxx 镜像的名字2.3、docker pull 某个 xxx 镜像的名字2.4、docker system df2.5、docker rmi 某个 xxx 镜像的名字 ID2.6、面试题&#xff1a;谈谈 …

谷歌seo网址如何快速被收录?

想让你的网站快速被搜索引擎收录&#xff0c;可以采取几种不同的策略。首先&#xff0c;确保你的网站内容丰富、有价值&#xff0c;搜索引擎更喜欢收录内容质量高的网站。同时&#xff0c;增强网站的外链建设&#xff0c;做好这些站内优化&#xff0c;接下来就是通过谷歌搜索控…

windows下自启springboot项目(jar+nginx)

1、将springboot项目打包为jar 2、新建文本文档 test.txt&#xff0c;并输入 java -jar D:\test\test.jar&#xff08;修改为自己的jar包位置&#xff09; 保存 然后修将后缀名改为 .bat 3、在同一目录再新建 文本文档test.txt&#xff0c;输入以下内容&#xff0c;&…

“杏鲍菇驱动机器人创新前行:康奈尔大学最新研究亮相Science子刊“

未来科技新篇章&#xff1a;杏鲍菇操控下的机器人奇旅&#xff01; 在这个日新月异的科技时代&#xff0c;你或许听说过机器人由AI驱动、由人脑操控&#xff0c;但你是否能想象&#xff0c;一颗看似平凡的杏鲍菇也能成为控制机器人的“大脑”&#xff1f; 没错&#xff0c;这不…

对抗性EM用于变分深度学习:在低剂量PET和低剂量CT中的半监督图像质量增强应用|文献速递--Transformer架构在医学影像分析中的应用

Title 题目 Adversarial EM for variational deep learning: Application to semi-supervised image quality enhancement in low-dose PET and low-dose CT 对抗性EM用于变分深度学习&#xff1a;在低剂量PET和低剂量CT中的半监督图像质量增强应用 01 文献速递介绍 医学影…

新专利:作物生长期预测方法及装置

近日,国家知识产权局正式授权了一项由北京市农林科学院智能装备技术研究中心、江苏省农业科学院联合申请的发明专利"作物生长期预测方法及装置"(专利号:ZL 2024 1 0185298.1)。该专利由 于景鑫 、任妮、吕志远、李友丽、吴茜等发明人耗时多年潜心研发&#xff0c;犹如…

6、关于Medical-Transformer

6、关于Medical-Transformer Axial-Attention原文链接&#xff1a;Axial-attention Medical-Transformer原文链接&#xff1a;Medical-Transformer Medical-Transformer实际上是Axial-Attention在医学领域的运行&#xff0c;只是在这基础上增加了门机制&#xff0c;实际上也就…

Java入门:08.Java中的static关键字01

1 static关键字 可以修饰属性变量&#xff0c;方法和代码段 static修饰的属性称为静态属性或类属性&#xff0c; 在类加载时就在方法区为属性开辟存储空间&#xff0c;无论创建多少个对象&#xff0c;静态属性在内存中只有一份。 可以使用 类名.静态属性 的方式引用 static修饰…

无人机动力系统设计之桨叶推力计算

无人机动力系统设计之桨叶推力计算 1. 源由2. 关键参数2.1 特性参数2.1.1 材质&#xff08;Material&#xff09;2.1.2 叶片数量&#xff08;Number of Blades&#xff09;2.1.3 重量&#xff08;Weight&#xff09;2.1.4 噪音水平&#xff08;Noise Level&#xff09; 2.2 安装…

一文为你详解期权波动率是什么?

今天期权懂带你了解一文为你详解期权波动率是什么&#xff1f;采用合适的期权组合来对冲或利用波动率变化带来的机会。不同策略适用于不同的市场条件和投资目标。 期权波动率 假如我们为地震灾害去买一份保险&#xff0c;你认为什么样地震的保险费会更贵呢&#xff0c;是深圳…

备忘录模式memento

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/memento 允许生成对象状态的快照并在以后将其还原。备忘录不会影响它所处理的对象的内部结构&#xff0c; 也不会影响快照中保存的数据。

2024年湖北交安ABC公路安全员C证报考今时不同往日

2024年湖北交安ABC公路安全员C证报考今时不同往日 之前的交安ABC&#xff0c;你爱搭不理&#xff0c;现在的交安ABC&#xff0c;你高攀不起。真的应了这句话。所以建筑行业考证要趁早&#xff0c;别等要求严了你想报却缺东少西的。湖北交安ABC大变天了。 2024年之前报考湖北交…

初识Maven:Java项目管理工具

实际开发中&#xff0c;伴随着项目规模的增长&#xff0c;依赖管理和构建自动化变得至关重要&#xff0c;一套标准化的项目结构有助于更好的开发项目、简化这项任务&#xff08;真的不是强迫症&#xff09; Maven&#xff0c;作为 Apache Software Foundation 维护的项目管理工…

【Unity面经】性能优化篇

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…