OpenCV入门6——图像基本变换

news2025/1/18 2:09:24

文章目录

  • 图像的放大与缩小
    • 缩放算法
    • 放大
  • 图像的翻转
  • 图像的旋转
  • 仿射变换之图像平移
  • 仿射变换之获取变换矩阵
  • 仿射变换之变换矩阵之二
  • OpenCV透视变换

图像的放大与缩小

在这里插入图片描述

缩放算法

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//4.jpg')
# (600, 480, 3)

new_img = cv2.resize(img, (300, 240))
new_img2 = cv2.resize(img, (300, 240), interpolation=cv2.INTER_AREA)

cv2.imshow('new_img', new_img)
cv2.imshow('img', img)
cv2.imshow('new_img2', new_img2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//4.jpg')
# (600, 480, 3)

new_img = cv2.resize(img, None, fx=0.3, fy=0.3)
new_img2 = cv2.resize(img, (300, 240), interpolation=cv2.INTER_AREA)

cv2.imshow('new_img', new_img)
cv2.imshow('img', img)
cv2.imshow('new_img2', new_img2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

放大

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//4.jpg')
# (600, 480, 3)

new_img = cv2.resize(img, None, fx=1.3, fy=1.3)
new_img2 = cv2.resize(img, (300, 240), interpolation=cv2.INTER_AREA)

cv2.imshow('new_img', new_img)
cv2.imshow('img', img)
cv2.imshow('new_img2', new_img2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

图像的翻转

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//4.jpg')
# 上下翻转
img2 = cv2.flip(img, 0)
# 左右翻转
img3 = cv2.flip(img, 1)
# 上下左右翻转
img4 = cv2.flip(img, -1)

cv2.imshow('img', img)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.imshow('img4', img4)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

图像的旋转

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

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//4.jpg')

img2 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
img3 = cv2.rotate(img, cv2.ROTATE_180)
img4 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

cv2.imshow('img', img)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.imshow('img4', img4)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

仿射变换之图像平移

详细见官方文档
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第一行的第三列是x轴偏移量,第二行第三列是y轴偏移量

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//4.jpg')
w, h, ch = img.shape
M = np.float32([[1, 0, 100], [0, 1, 20]])

img2 = cv2.warpAffine(img, M, (h, w))

cv2.imshow('img', img)
cv2.imshow('img2', img2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

仿射变换之获取变换矩阵

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

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//10.jpg')
w, h, ch = img.shape
# M = np.float32([[1, 0, 100], [0, 1, 20]])

# 旋转的角度为逆时针
M = cv2.getRotationMatrix2D((100, 100), 30, 1)
M2 = cv2.getRotationMatrix2D((h / 2, w / 2), 60, 0.6)

# 如果想改变新图像尺寸,需修改dsize
img2 = cv2.warpAffine(img, M, (h, w))
img3 = cv2.warpAffine(img, M2, (h, w))

cv2.imshow('img', img)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

仿射变换之变换矩阵之二

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

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//10.jpg')
w, h, ch = img.shape
# M = np.float32([[1, 0, 100], [0, 1, 20]])

# 旋转的角度为逆时针
# M = cv2.getRotationMatrix2D((100, 100), 30, 1)
# M2 = cv2.getRotationMatrix2D((h / 2, w / 2), 60, 0.6)

src = np.float32([[100, 200], [300, 200], [100, 400]])
dst = np.float32([[50, 100], [200, 400], [90, 300]])

M = cv2.getAffineTransform(src, dst)

# 如果想改变新图像尺寸,需修改dsize
img2 = cv2.warpAffine(img, M, (h, w))
# img3 = cv2.warpAffine(img, M2, (h, w))

cv2.imshow('img', img)
cv2.imshow('img2', img2)
# cv2.imshow('img3', img3)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//10.jpg')
w, h, ch = img.shape
# M = np.float32([[1, 0, 100], [0, 1, 20]])

# 旋转的角度为逆时针
# M = cv2.getRotationMatrix2D((100, 100), 30, 1)
# M2 = cv2.getRotationMatrix2D((h / 2, w / 2), 60, 0.6)

src = np.float32([[100, 200], [300, 200], [100, 400]])
dst = np.float32([[50, 100], [200, 400], [60, 500]])

M = cv2.getAffineTransform(src, dst)

# 如果想改变新图像尺寸,需修改dsize
img2 = cv2.warpAffine(img, M, (h, w))
# img3 = cv2.warpAffine(img, M2, (h, w))

cv2.imshow('img', img)
cv2.imshow('img2', img2)
# cv2.imshow('img3', img3)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

OpenCV透视变换

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

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('img2', cv2.WINDOW_NORMAL)
img = cv2.imread('perspective.jpeg')

src = np.float32([[100, 1000], [2100, 1000], [0, 4000], [2500, 3900]])
dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]])
M = cv2.getPerspectiveTransform(src, dst)

img2 = cv2.warpPerspective(img, M, (2300, 3000))

cv2.imshow('img', img)
cv2.imshow('img2', img2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建 AI 图像生成器 (SAAS) php laravel

今天来搭一套,AI 图像生成器 是基于 Openai DALLE 2 和 Openai DALLE 3 以及 Stability AI 和稳定扩散 API 构建的脚本,为用户提供了使用简单的提示和大小生成独特自定义图像的可能性。在这个平台上,创意得以快速、高效地实现,借助…

继承语法详解

继承语法详解 一:继承1:什么是继承 二:访问成员变量三:访问成员方法四:访问父类的成员变量和成员方法super关键字super和this关键字的区别 五:子类的构造方法六:代码块七:final关键字八&#xf…

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

参考:https://www.cnblogs.com/sam-snow-v/p/15917898.html eclipse链接SQL Server出现问题 笔者使用Open JDK 17,SQL Server 2016,项目中使用JPA操作数据库。测试环境没问题,生产环境出现如题所示“驱动程序无法通过使用安全套接…

[Docker]六.Docker自动部署nodejs以及golang项目

一.自动部署nodejs 1.创建node项目相关文件 app.js代码如下: var express require(express);var appexpress();app.get(/,function(req,res){res.send(首页update); }) app.get(/news,function(req,res){res.send(首页); })//docker做端口映射的时候不要指定ip app.listen(30…

浏览器页面被恶意控制时的解决方法

解决360流氓软件控制浏览器页面 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、接受360安全卫士的好意(尽量不要选)二、拒绝360安全卫士的好意(强烈推荐)第…

unity教程

前言 伴随游戏行业的兴起,unity引擎的使用越来越普遍,本文章主要记录博主本人入门unity的相关记录大部分依赖siki学院进行整理。12 一、认识unity引擎? 1、Unity相关信息: Unity的诞生:https://www.jianshu.com/p/550…

webpack 中,filename 和 chunkFilename 的区别

filename filename 是一个很常见的配置,就是对应于 entry 里面的输入文件,经过webpack打包后输出文件的文件名。比如说经过下面的配置,生成出来的文件名为 index.min.js。 chunkFilename chunkFilename 指未被列在 entry 中,却…

LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字

上一节实现了 LangChain 实现给动物取名字, 实际上每次给不同的动物取名字,还得修改源代码,这周就用模块化template来实现。 1. 添加promptTemplate from langchain.llms import OpenAI # 导入Langchain库中的OpenAI模块 from langchain.p…

springboot323基于Java的美妆购物网站的设计与实现

交流学习: 更多项目: 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示: ————————————————

资产设备管理系统

dtAsset 是一个固定资产设备管理系统,它专为中小企业的需求而设计。该软件提供了对常用资产设备进行信息化管理的功能,并支持自定义设备类型、导入导出数据、维护工作统计、采购管理、文档管理、运维监控 (使用 Zabbix)、知识库等功能。 主要模块 1.系统…

【Rust】快速教程——闭包与生命周期

前言 你怎么向天生的瞎子说清颜色?怎么用手势向天生的聋子描述声音? 鲜花就在眼前,雷鸣就在头顶,对他们来说却都毫无意义 眼睛看不到,鼻子可以嗅闻花香,耳朵听不见,手指可以触碰窗纸的震动。 犯…

QtCreator13源码windows编译

1.下载QtCreator13源码: https://download.qt.io/snapshots/qtcreator/13.0/13.0.0-beta1/installer_source/latest/qt-creator-opensource-src-13.0.0-beta1.zip 2.下载并安装llvm Release LLVM 17.0.5 llvm/llvm-project GitHub 3.系统 要求: Windows 10 (64…

2023OceanBase年度发布会后,有感

很荣幸收到了OceanBase邀请,于本周四(11月16日)参加了OceanBase年度发布会并参加了DBA老友会,按照理论应该我昨天(星期五)就回到成都了,最迟今天白天就该把文章写出来了,奈何媳妇儿买…

vue2【axios请求】

1:axios作用 axios(发音:艾克c奥斯)是前端圈最火的,专注于数据请求的库。 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中axios的github:https://github.com/axios/axios 中文官网地址…

ESP32网络开发实例-非接触式水位监测

非接触式水位监测 文章目录 非接触式水位监测1、HC-SR04介绍2、软件准备3、硬件准备4、代码实现在本文中,我们将使用 HC-SR04 超声波传感器和 ESP32 创建一个水位监测网络服务器。 这将是一个非接触式水位测量系统。 首先,我们将介绍HC-SR04 与 ESP32 连接。 使用ESP32对超声…

如何去掉图片上的水印?这三种去水印的方法帮你解决!

当我们从网上看到喜欢的图片,想要保存下来作为头像或者插入到工作汇报中时,却发现下载的图片带有水印。这不仅影响了图片的美观,还可能对图片的可用性造成影响。那么,如何去掉图片上的水印呢? 实际上,现在市面上的很多…

【数据结构】10道经典面试题目带你玩转链表

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.移除链表元素 二.反转链表 三.链表的中间结点 四.链表中倒数第K个结点 五.合并两个有序链表 六.链表分割 七.链表的回文结构 八.相交链表 九.环形链表 一.移…

[Vue3] pinia状态管理

文章目录 1.pinia的介绍2.pinia的配置3.state状态管理3.1 state的基本使用3.2 state的访问 4.getters 1.pinia的介绍 Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。如果你熟悉组合式 API 的话,你可能会认为可以通过一行简单的 export …

梦想编织者——Adobe Dreamweaver

今天,我们来谈谈一款在Adobe系列中推出的一款Adobe Dreamweaver,简称“DW”,中文名称 “梦想编织者”,是集网页制作和管理网站于一身的所见即所得网页代码编辑器。 利用对 HTML、CSS、JavaScript等内容的支持,设计人员…

QGIS003:【05高级数字化工具栏】-要素移动、修改、合并操作

摘要:QGIS地图导航工具栏包括激活高级数字化工具、移动要素、旋转要素、缩放要素、简化要素、添加环、添加部件、填充环、删除环、删除部件、重塑要素、偏移曲线、反转线、裁剪/扩展要素、分割要素、分割部件、合并所选要素、合并所选要素的属性、旋转点符号等选项&…