三、图片的几何变换

news2024/11/18 21:44:10

目录

  • 一、图片缩放
    • 1 - 等比缩放
    • 2 - 最近领域插值
    • 3 - 双线性插值
    • 4 - 矩阵缩放
  • 二、图片剪切与位移
    • 1 - 图片剪切
    • 2 - 图片位移
  • 三、图片镜像
  • 四、图片仿射变换
  • 五、图片旋转

一、图片缩放

1 - 等比缩放

# 1 load 2 info 3 resize 4 check
import cv2

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
print(imgInfo)
height = imgInfo[0]
width = imgInfo[1]
mode = imgInfo[2] # 图片的颜色组成方式,3表示1个像素点由3个基本颜色组成
# 1 放大 缩小 2 等比例 非等比例 2:3
dstHeight = int(height * 0.5)
dstWidth = int(width * 0.5)
# 最近临域插值、双线性插值、像素关系重采样、立方插值
# 默认是:双线性插值
dst = cv2.resize(img, (dstWidth, dstHeight))
cv2.imshow('image', dst)
cv2.waitKey(0)

在这里插入图片描述

2 - 最近领域插值

  • 最近领域插值原理
    • 假设我们有1个源图片src,大小为1020,我们希望缩放成目标图片dst,大小为510
    • 我们知道,目标图片dst上的每一个点都是来源于源图片src,例如dst的(1,2)来源于src(2,4)
    • 拿x坐标举例,dst的x=1,y=2的像素点,在源图src的计算公式为
      • newX = x*(src行 / dst行)=1 * (10 / 5)=2
      • newX = y*(src列 / dst列)=2 * (20 / 10)=4
    • 上面的计算都是整数的计算,如果计算结果为12.3,那么使用最近领域插值,就会使用12这个坐标的像素,这就是最近领域插值的算法
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dstHeight = int(height / 2)
dstWidth = int(width / 2)
# 使用np创建空白模板
dstImage = np.zeros((dstHeight, dstWidth, 3), np.uint8)  # 0-255
for i in range(0, dstHeight):  # 行
    for j in range(0, dstWidth):  # 列
        iNew = int(i * (height * 1.0 / dstHeight))
        jNew = int(j * (width * 1.0 / dstWidth))
        dstImage[i, j] = img[iNew, jNew]
cv2.imshow('dst', dstImage)
cv2.waitKey(0)

在这里插入图片描述

3 - 双线性插值

  • 双线性插值原理
    • m(15,22)、n(15,23)、j(16,22)、k(16,23)代表的是4个像素点的坐标
    • 假设经过计算出来的结果是(15.2,22.3),这个点在源图像上实际上是不存在的
    • 按最近领域插值法的结果是(15,22)
    • 双线性插值计算,会使用X橙色方向的投影,和Y绿色方向的投影
      • 此时投影出交叉的4个点A1(15.2,22),A2(15.2,23),B1(15,22.3),B2(16,22.3)
      • A1距离m(15,22)是0.2,距离j(16,22)是0.8,可以使用权重表示分别是20%和80%
      • 同理B1距离m(15,22)是0.3=30%,距离n(15,23)是0.7=70%
      • A1 = m * 20% + j * 80%,A2 = n * 20% + k * 80%
      • B1 = m * 30% +n * 70%,B2 = j * 30% + k * 70%
      • 以上分析得出,最终坐标计算公式
        • 方法1:最终点 T = A1 30% + A2 70%
        • 方法2:最终点 T = B1 20% + B2 80%
          在这里插入图片描述

4 - 矩阵缩放

  • 矩阵缩放原理
    • 2行3列矩阵:[[A1 A2 B1],[A3 A4 B2]]
    • 我们将这个2行3列的矩阵拆分成2个矩阵
      • 2行2列矩阵:[[A1 A2],[A3 A4]]
      • 2行1列矩阵:[[B1],[B2]]
    • 那么新的坐标计算公式为:
      • newX = A1x + A2y+B1
      • newY = A3x +A4y+B2
    • 例如:B1,B2偏移为0,图片缩放0.5,那么newX = x * 0.5
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
matScale = np.float32([[0.5, 0, 0], [0, 0.5, 0]])
dst = cv2.warpAffine(img, matScale, (int(width / 2), int(height / 2)))
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

二、图片剪切与位移

1 - 图片剪切

  • 需求:剪切原图片:x从100到200,y从100-300
import cv2

img = cv2.imread('image0.jpg', 1)
dst = img[100:200, 100:300]
cv2.imshow('image', dst)
cv2.waitKey(0)

在这里插入图片描述

2 - 图片位移

  • 图片向右位移100个像素
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
dst = np.zeros(img.shape, np.uint8)
height = imgInfo[0]
width = imgInfo[1]
for i in range(0, height):
    for j in range(0, width - 100):
        dst[i, j + 100] = img[i, j]
cv2.imshow('image', dst)
cv2.waitKey(0)

在这里插入图片描述

  • 图片向右位移100像素,向下位移200像素
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 偏移矩阵
matShift = np.float32([[1, 0, 100], [0, 1, 200]])  # 2行3列
dst = cv2.warpAffine(img, matShift, (height, width))
# 移位 矩阵
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

三、图片镜像

  • 将原始的图片进行上下翻转:上半部分为原图,下半部分为翻转的镜像图
    • 创建一个足够大的画板,宽度跟原图像相同,高度为原图像的2倍
    • 将图像分别从前向后,从后向前绘制
    • 绘制中心分割线
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]
newImgInfo = (height * 2, width, deep)
dst = np.zeros(newImgInfo, np.uint8)  # uint8
for i in range(0, height):
    for j in range(0, width):
        dst[i, j] = img[i, j]
        # x y = 2*h - y -1
        dst[height * 2 - i - 1, j] = img[i, j]
# 分割线
for i in range(0, width):
    dst[height, i] = (0, 0, 255)  # BGR
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

四、图片仿射变换

  • 图片仿射原理
    • 前提:我们知道2个点可以确定1条线,3个点可以确定1个唯一的平面
    • 图片仿射就是将原图片中的3个点(左上角、左下角、右上角),隐射到新图片的3个点上,这样就实现了图片的仿射变换
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# src 3->dst 3 (左上角 左下角 右上角)
matSrc = np.float32([[0, 0], [0, height - 1], [width - 1, 0]])
matDst = np.float32([[50, 50], [300, height - 200], [width - 300, 100]])
# 获得矩阵组合
matAffine = cv2.getAffineTransform(matSrc, matDst)  # mat 1 src 2 dst
dst = cv2.warpAffine(img, matAffine, (width, height))
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

五、图片旋转

  • 缩放系数为0.5的情况
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 旋转矩阵:2*3
# getRotationMatrix2D:参数1 -> 旋转的中心点坐标,参数2 -> 旋转的角度,参数3 -> 缩放的系数
matRotate = cv2.getRotationMatrix2D((height * 0.5, width * 0.5), 45, 0.5)
# 100*100 25
dst = cv2.warpAffine(img, matRotate, (height, width))
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

  • 缩放系数为1.0的情况:我们可以看到缩放的系数设置可能会导致图片超出范围
    在这里插入图片描述

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

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

相关文章

软件工程详细知识点复习(上)

文章目录一、软件工程概述1、软件与软件危机2、软件工程二、可行性研究三、需求分析四、概要设计五、详细设计一、软件工程概述 1、软件与软件危机 软件程序数据文档 1、软件危机的主要表现 软件不能满足用户需求软件开发成本严重超标,开发周期大大超过规定日期…

网络设备安装上线,你要知道的10个步骤

大家好,我是技福的小咖老师。在网络工程中设备的安装工作必不可少,你平时都是按哪些步骤完成的?今天给大家总结一下最常见的10个步骤。 安装流程 网络设备安装流程图 安装环境要求 1► 安装场景 为确保设备的正常运行,延长设备…

C. Infected Tree(思维+DFS)

Problem - 1689C - Codeforces Byteland是一片美丽的土地,因其美丽的树木而闻名。 米沙发现了一棵有n个顶点的二叉树,编号从1到n。二叉树是一个无环连接的双向图,包含n个顶点和n-1条边。每个顶点的度数最多为3,而根是数字为1的顶…

基于STM32G431嵌入式学习笔记——五、NVIC中断(以串口UART中断为例)

一、基础知识 1.专业术语 2.NVIC简介 ①在这里要注意,中断控制是分级处理的 ②是否请求中断是中断源控制的。 ③是否响应中断是响应方控制的。 ④以外部中断为例,外部中断请求顺序就是首先从请求的外部设备中选出优先级最高的一个设备待中断&#xff0c…

唐山盐碱滩成渤海明珠 国稻种芯·中国水稻节:河北曹妃甸大米

唐山盐碱滩成渤海明珠 国稻种芯中国水稻节:河北曹妃甸大米 新华社音视频部制作 记者 杨世尧 河北新闻网讯 王士波 赵诤国 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康…

电脑怎么迁移游戏资源,数据迁移能把游戏数据迁移吗

概述:玩家们在打游戏的过程中,会产生很多数据,尤其是那些大型游戏的玩家,都会珍惜游戏数据。电脑怎么迁移游戏资源?如果您刚刚购买了一台新电脑,并且正在寻找将游戏迁移到新电脑的方法,相信本文…

8 张图 | 剖析 Eureka 的首次同步注册表

注册表对于注册中心尤为重要,所有的功能都是围绕这个注册表展开。比如服务 A 要想访问服务 B,就得知道服务 B 的 IP 地址和端口号吧。如下图所示,传统的方式就是服务 A 知道了服务 B 的地址后,发送 HTTP 请求到对应的 API 地址上。…

MySQL事务管理 MVCC,隔离性详解

目录事务管理事务背景什么是事务?事务的四个属性为什么会出现事务?MySQL支持事务的版本事务提交方式事务常见操作方式演示(体现原子性和持久性)操作注意事项结论事务隔离性查看与设置隔离性各种隔离性演示读未提交【Read Uncommitted】脏读读提交【Read Committed】…

【SNUT集训1】排序 二分 前缀和 差分(6 / 16)

目录 P1094 [NOIP2007 普及组] 纪念品分组 - 排序贪心双指针 P1571 眼红的Medusa - 哈希表 P1678 烦恼的高考志愿 P1024 [NOIP2001 提高组] 一元三次方程求解 1、二分法 2、暴力 P7585 [COCI2012-2013#1] LJUBOMORA - 二分 P4552 [Poetize6] IncDec Sequence- 差分思维…

【Vue学习之从入门到神经】

14天学习训练营导师课程: 郑为中《Vue和SpringBoot打造假日旅社管理系统》 目录 1. VUE介绍 2. Vue导入 3. VUE相关指令 4. 显示隐藏相关 5. Vue周边库 1. VUE介绍 VUE是目前最流行的前端框架, 基于MVVM设计模式VUE框架两种用法: 多页面应用, 在html页面中引入…

【HMS Core】游戏初始化

前提条件 实现游戏初始化前,必须已经完成AppGallery Connect的配置准备,参见AGC控制台准备。已完成集成SDK和配置混淆脚本。 注意事项 本场景中涉及的功能必须在应用启动时完成,而不是用户在进行登录、支付等操作时才完成,否则可…

无线传感器网络:物理层设计

文章目录Physical Layer TechnologiesRadio FrequenciesNarrow-Band CommunicationSpread SpectrumDSSSFHSSUltra Wide Band (UWB)Optical CommunicationAcoustic CommunicationMagnetic Induction CommunicationRF Wireless CommunicationWireless Channel EffectsAttenuation…

项目工作中,管理者如何合理安排任务优先级?

面对各种工作的时候,你是否总是会手忙脚乱? 在项目工作中,管理者每天面对各种工作:需求、沟通还有其他五花八门任务。 管理者应该如何合理安排自己任务的优先级呢? 在安排任务优先级的时候,我最常用方法…

后台部署运维零碎总结

一、场景 为了实现项目部署简化,尽量都由脚本来完成,需要将许多手动处理过程进行脚本化处理。 二、环境 1、VMware 虚拟机 Download VMware Workstation Pro 2、获取CentOs 镜像 3、使用镜像在虚拟机中安装 4、配置网卡信息,重启网络 三…

【算法基础复习1】差分

目录 一、差分简介 一维差分结论 Acwing.797 差分 P4552 [Poetize6] IncDec Sequence - 差分思维玄学题 一、差分简介 规定a数组下标从1开始 a[0]0b数组下标从1开始定义一个数组b,使 对于a数组 其差分数组b为 a是b的前缀和数组 比如 a[2]…

Python实战 | 如何抓取tx短片弹幕并作词云图分析

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 本次目的:采集tx短片弹幕,并且做词云图可视化分析 这个不少漫迷应该都看过吧~ 哪里都好,就是更新太慢了一点,剧情磨蹭了一点,哎 那今天我们就来采集一下它的弹幕吧&#xff…

我把提高开发效率的VSCode插件分享出来了

前言 最近在家办公,写代码发现没有那么流畅,一看是某些插件没有安装,搞得写代码的效率降低,所以这里有些比较实用的插件推荐给大家 开发实用插件 Settings Sync 利用 Settings Sync 💎将 VS Code 的设置保存在gith…

MCE | HPV 疫苗要不要打?

HPV 感染很大概率会患宫颈癌?HPV 感染 ≠ 患宫颈癌超过 90% 的 HPV 感染者无症状,并无需干预能在 2 年内清除感染。虽然大部分 HPV 感染会自行消退,但所有感染女性都面临 HPV 感染转为慢性,以及癌前病变发展为浸润性宫…

ViewPager2+TabLayout

效果图: MainActivity public class MainActivity extends AppCompatActivity {private TabLayout tabLayout;private ViewPager2 viewPager2;private int activeColor Color.parseColor("#ff678f");private int normalColor Color.parseColor("#…

C++入门教程||C++中的输入输出||C++ 注释

1. cout输出流的使用&#xff1a; cout输出流需要搭配<<输出操作符来使用&#xff0c;如输出语句&#xff1a; 1 cout<<"Hello"; 即会在屏幕上显示字符串Hello。 本质上&#xff0c;是将字符串"Hello"插入到cout对象里&#xff0c;并以cout…