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

文章目录

  • 图像的放大与缩小
    • 缩放算法
    • 放大
  • 图像的翻转
  • 图像的旋转
  • 仿射变换之图像平移
  • 仿射变换之获取变换矩阵
  • 仿射变换之变换矩阵之二
  • 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()

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

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

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

相关文章

前端学习笔记--TypeScript

1. typescript是什么 Typescript是由微软开发的一款开源的编程语言Typescript是Javascript的超集,遵循最新的ES5/ES6规范。TypeScript扩展了Javascript语法TypeScript更像后端Java、C#这样的面向对象语言可以让JS开发大型企业应用越来越多的项目是基于TS的&#xf…

深入理解TensorFlow:计算图的重要性与应用

TensorFlow是一个流行而强大的机器学习框架,其核心概念之一是计算图(computation graph)。计算图在TensorFlow中扮演着重要角色,作为一种数据流图表示形式,它能够将计算的过程可视化,同时方便优化、分布式计…

2023.11.16使用原生js和canvas实现图片矩形框标注功能

2023.11.16使用原生js和canvas实现图片矩形框标注功能 做训练的时候需要一些数据集&#xff0c;但是网上数据集有时不能满足自身的使用需求&#xff0c;自己编制一个标注软件实现数据采集功能。 记录的数据集可以传入后端&#xff0c;在后端再次进行处理。 <!DOCTYPE htm…

Linux - 用户级缓冲区和系统缓冲区 - 初步理解Linux当中文件系统

前言 文件系统 我们先来看两个例子&#xff1a; 这个程序输出&#xff1a; 此时的输出也满足的我们预期。 我们也可以把 程序执行结果&#xff0c;输出重定向到 一个文件当中: 当我们在代码的结尾处&#xff0c;创建了子进程&#xff0c;那么输出应该还是和上述是一样的&…

C# 实时监控双门双向门禁控制板源码

本示例使用设备&#xff1a;实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.…

数据库实验报告(六)

实验报告&#xff08;六&#xff09; 1、实验目的 &#xff08;1&#xff09; 掌握关联查询的用法 &#xff08;2&#xff09; 掌握集合查询的区别和用法 &#xff08;3&#xff09; 掌握EXISTS的用法 2、实验预习与准备 &#xff08;1&#xff09; 了解ANY&…

在docker中部署MySQL

目录 1、拉取最新的镜像 2、创建mysql容器实例 3、启动mysql实例 4、进入mysql 交互环境 5、登录MySQL数据库 6、尽情享用mysql 1、拉取最新的镜像 docker image pull mysql 2、创建mysql容器实例 第一次执行&#xff0c;需要先创建容器并启动&#xff08;容器名是mys…

分享一个自用的Win11护眼主题(无需下载)

先放上几张效果图 设置方法 首先&#xff0c;把主题设置为高对比度主题——沙漠。 然后点击编辑&#xff0c;依次设置为以下值 背景&#xff1a;#1C5E75文本&#xff1a;#FFF5E3超链接&#xff1a;#6EFFA4非活动文本&#xff1a;#FFF5E3选定文本&#xff1a;#903909、#8EE3F0…

巾帼调查队开展实务调查技能,促全职妈妈联增收

2024年11月14日上午&#xff0c;由罗湖区妇联主办、罗湖区懿米阳光公益发展中心承办的“巾帼调查队—社区女性增值计划”项目第三期活动在罗湖区妇儿大厦六楼成功举办&#xff0c;30名阳光妈妈及全职妈妈参与了此次调查实务技巧培训。 在培训开始之前&#xff0c;巾帼调查队的创…

深度探讨丨关于工作量证明的常见误解

有一种基本误解认为&#xff0c;工作量证明机制在本质上是不可扩展的&#xff0c;并且会产生过度的能源耗费。 按照工作量证明区块链的最初设计&#xff0c;以及BSV区块链协会的推广&#xff0c;这一技术旨在实现可扩容性&#xff0c;同时确保高效能系统内的安全性和互操作性。…

基于IDEA进行Maven工程构建

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 1. 构建概念和构建过程 项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程&#xff0c;在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中…

【智能家居】5、主流程设计以及外设框架编写

一、主流程设计 #include <stdio.h>int main(){//指令工厂初始化//控制外设工厂初始化//线程池return 0; } 1、工厂模式结构体定义 &#xff08;1&#xff09;指令工厂 inputCmd.h struct InputCmd{char cmdName[128];//指令名称char cmd[32];//指令int (*Init)(char …

解决margin-top导致的塌陷

什么是margin-top塌陷 若要使子元素距离父元素顶部有一定距离&#xff0c;如果只给子元素设置margin-top属性&#xff0c;结果发现父元素顶部出现位移&#xff0c;子元素相对父元素没位移&#xff0c;这就是margin-top导致的塌陷。 .fatherplus{width: 600px;height: 600px;b…

筋膜炎怎么治疗才能除根

筋膜炎的引起原因&#xff0c;常见的有以下几种&#xff1a; 1.职业因素。经常牵拉某些肌肉容易导致肌肉出现劳损&#xff0c;如司机、教师、运动员等&#xff0c;发生筋膜炎的几率会明显比正常人要高。 2.疾病因素。例如扁平足、糖尿病的人群&#xff0c;发生足底筋膜炎的几…

为了 Vue 组件测试,你需要为每个事件绑定的方法加上括号吗?

本文由华为云体验技术团队松塔同学分享 先说结论&#xff0c;当然不是&#xff01;Vue 组件测试&#xff0c;尤其是组件触发事件的测试&#xff0c;有成熟的示例。我们同样要关注测试的原则&#xff0c;例如将组件当成黑盒&#xff0c;不关心其内部实现&#xff0c;而只关心与其…

java集合,栈

只有栈是类 列表是个接口 栈是个类 队列 接口有双链表,优先队列(堆) add会报错 offer是一个满了不会报错 set集合 有两个类实现了这个接口

剑指Offer || 105.岛屿的最大面积

题目 给定一个由 0 和 1 组成的非空二维数组 grid &#xff0c;用来表示海洋岛屿地图。 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表水&#x…

div中一个div怎么在高度上居中,小div在大div的高度的中间

实现效果: 让这个去分享在高度上的居中 答案: 直接设置 margin:auto;

Draco Win10编译

1. 工具 CMake 3.2.8&#xff0c;Visual Studio 2019 2. 步骤 2.1 拷贝代码 git clone https://github.com/google/draco.gitgit clone https://github.com/google/draco.git 下载第三方依赖 git submodule sync git submodule update --init --recursive 2.2 CMake编译…

Linux Shell脚本的10个有用的“面试问题和解答”

Shell 是什么&#xff1f; 在 Linux 中&#xff0c;Shell 是一个应用程序 &#xff0c;它是用户与 Linux 内核沟通的桥梁。 它负责接收用户输入的命令&#xff0c;根据用户的输入找到其他程序并运行&#xff0c;Shell负责将应用层或者用户输入的命令传递给系统内核&#xff0…