【opencv 系列】第3章 图像的8种变换
文章目录
- 前言
- 上代码
- 1.1 复习读取和显示
- 1.2 图像放大、缩小 cv2.resize()
- 1.3 图像平移
- 1.4 图像旋转
- 1.5 图像仿射变换
- 1.6 图像的裁剪
- 1.7 位运算(AND, OR, XOR)
- 1.8 图像的分离和融合
- 1.9 颜色空间 color space
前言
坦白说,这一章我认为是整个opencv系列最难的一张,学会这一章需要用到很多前置知识,而我对这章的认知也很浅薄,大家加油。
提纲如下,其中4的原理比较复杂,支撑是矩阵运算。 6,7,8理解起来都有点难度,是因为应用空间比较少,你也能知道怎么实现,但不知道用在哪。
- 图像放大、缩小;cv2.resize(img, None,fx=0.5,fy=0.5,interpolation=cv2.INTER_LINEAR) cv2.resize(img, (width2, height2), interpolation=cv2.INTER_LINEAR)
- 图像平移; cv2.warpAffine()
- 图像旋转;
- 图像仿射变换;
- 图像裁剪;
- 图像的位运算(AND, OR, XOR);
- 图像的分离和融合;
- 图像的颜色空间;
本章节内容适合在jupternotebook直接呈现
上代码
1.1 复习读取和显示
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread("../images/logo.png")
plt.imshow(img)

上面的颜色不对是因为没有变化通道,可以看第一章
img_new = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_new)

1.2 图像放大、缩小 cv2.resize()
图像放大、缩小 cv2.resize()
resize_img = cv2.resize(img, (width*2, height*2), interpolation=cv2.INTER_LINEAR)
plt.imshow(resize_img)

# cv2.resize() # 缩小, 扩大课缩小的两种方式啦 一个是传size的元组,一个是 传fx,fy的比例small_img = cv2.resize(img, None,fx=0.5,fy=0.5,interpolation=cv2.INTER_LINEAR)
plt.imshow(small_img)

1.3 图像平移
# 1 平移 cv2.warpAffine()
height,width = img.shape[:2]
M1 = np.float32([[1,0,10],[0,1,40]]) # 平移矩阵, 图像向右平移10个像素,向下移动40个像素
move_img = cv2.warpAffine(img, M1,(width,height))
plt.imshow(move_img)

1.4 图像旋转
height, width = img.shape[:2]
center = (width//2.0, height//2.0) # 渲染的中心
M3 = cv2.getRotationMatrix2D(center, 180 , 1) # 1 表示旋转过程中没有缩放
rotation_img = cv2.warpAffine(img,M3, (width, height))
plt.imshow(rotation_img)

1.5 图像仿射变换
就是一个图片的拉伸,旋转,扭曲的变化,通过矩阵乘法实现的,就是两个空间矩阵的作用,
简单理解2位空间就是 y=2x + 3, 沿着向量(2,3) 做一次移动
p1,p2 是自造的,可以使任意的值,在三个通道下,做三个(2,3)的移动
# cv2.getAffineTransform(p1,p2)
p1 = np.float32([[120,35],[215,45],[135,120]])
p2 = np.float32([[135,45],[300,110],[130,230]])
M4 = cv2.getAffineTransform(p1,p2) # 计算一个变换矩阵
trans_img = cv2.warpAffine(img,M4, (width,height))
plt.imshow(trans_img)

1.6 图像的裁剪
这个是最简单的一种变换
crop_img = img[20:140, 40:200]
plt.imshow(crop_img)

1.7 位运算(AND, OR, XOR)
按位与运输 或运输 非运算
计算机组成上或者C语言教材上的基本落脚点,逻辑控制/电路控制 没想到吧,图形控制也有我。
# 长方形
rectangle = np.zeros((300, 300), dtype='uint8')
plt.imshow(rectangle)
# 0 像素点代表黑

rectangle = np.zeros((300, 300), dtype='uint8')
# 255是填充颜色 ?? 未知
# -1 是填充的厚度, -1 是完全填充, 10是10像素填充 (25,25) 左上 (275,275) 右下
rect_img = cv2.rectangle(rectangle,(25,25),(275,275),255,-1)
plt.imshow(rect_img)

rectangle = np.zeros((300,300), dtype='uint8')
# (150,150) 圆心, 150 半径 255,未知, -1 完全填充
circle_img = cv2.circle(rectangle,(150,150),150,255,-1)
plt.imshow(circle_img)

# 与运算:cv2.bitwise_and(), 00:0 01:0, 10:0, 11:1 与运行时同性相吸
and_img = cv2.bitwise_and(rect_img,circle_img)
plt.imshow(and_img)

# OR 或运算 01:1, 10:1,00:0, 11:1 有1放行
or_img = cv2.bitwise_or(rect_img, circle_img)
plt.imshow(or_img)

# XOR 抑或运算 01:1 10:1 00:0 11:0 异性相吸
xor_img = cv2.bitwise_xor(rect_img,circle_img)
plt.imshow(xor_img)

1.8 图像的分离和融合
img = cv2.imread("../images/logo1.png")
plt.imshow(img)
B,G,R = cv2.split(img) # 分离

plt.imshow(B) #蓝色

plt.imshow(G) #蓝色

plt.imshow(R)

2.融化
# 2.融合
zeros = np.zeros(img.shape[:2],dtype="uint8")
plt.imshow(cv2.merge([zeros,zeros,R]))

plt.imshow(cv2.merge([B,zeros,zeros]))

plt.imshow(cv2.merge([zeros,G,zeros]))

1.9 颜色空间 color space
# 灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray)

# HSV(色度、饱和度、纯度)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
plt.imshow(hsv)

名称
在开始之前,先明确一下Lab颜色空间(Lab color space)的名字:
- Lab的全称是CIELAB,有时候也写成CIE Lab*
- 这里的CIE代表International Commission on Illumination(国际照明委员会),它是一个关于光照、颜色等的国际权威组织。
通道
Lab是由一个亮度通道(channel)和两个颜色通道组成的。在Lab颜色空间中,每个颜色用L、a、b三个数字表示,各个分量的含义是这样的:
- L*代表亮度
- a*代表从绿色到红色的分量
- b*代表从蓝色到黄色的分量
Perceptual uniform
Lab是基于人对颜色的感觉来设计的,更具体地说,它是感知均匀(perceptual uniform)的。Perceptual uniform的意思是,如果数字(即前面提到的L、a、b这三个数)变化的幅度一样,那么它给人带来视觉上的变化幅度也差不多。
Lab相较于RGB与CMYK等颜色空间更符合人类视觉,也更容易调整:想要调节亮度(不考虑Helmholtz–Kohlrausch effect,见下注)就调节L通道,想要调节只色彩平衡就分别调a和b。
注:Helmholtz–Kohlrausch effect是人眼的一种错觉——当色彩饱和度高时,颜色会看起来更亮
#lab
lab = cv2.cvtColor(img,cv2.COLOR_BGR2Lab)
plt.imshow(lab)

相关文章:
【opencv 系列】第3章 图像的8种变换
文章目录前言上代码1.1 复习读取和显示1.2 图像放大、缩小 cv2.resize()1.3 图像平移1.4 图像旋转1.5 图像仿射变换1.6 图像的裁剪1.7 位运算(AND, OR, XOR)1.8 图像的分离和融合1.9 颜色空间 color space前言 坦白说,这一章我认为是整个opencv系列最难的一张&…...
【C语言刷题】倒置字符串
解题思路与过程📽️解题思路📽️解题过程🔧1.输入🔧2.设计逆序函数🔧3.逆序整个字符串🔧4.逆序每个单词📽️源码📷先来看题👇📽️解题思路 🔴 首先…...
用switch语句编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:
用switch语句编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:操作数1 运算符op 操作数2计算表达式的值,指定的算术运算符为加()、减(-)、乘(*)、除&#…...
uboot编译分析
uboot编译分析 V 1 –> Q ,在一行命令前面加上表示不会在终端输出命令 KCONFIG_CONFIG ? .config.config 默认是没有的,默认是需要使用命令“make xxx_defconofig”先对uboot进行配置,配置完成就会在uboot根目录下生成.config。如果后续自行调整…...
SpringCloud Alibaba集成Dubbo实现远程服务间调用
SpringCloud Alibaba集成Dubbo实现远程服务间调用 工程创建 一、创建springBoot分模块项目,父工程:springcloud-alibaba以及子模块product-dubbo-provider、order-dubbo-consumer等 项目基本结构图如下所示: 二、依赖引入 在以上两个子模块…...
网络编程(一)
网络编程 文章目录网络编程前置概念1- 字节序高低地址与高低字节高低地址:高低字节字节序大端小端例子代码判断当前机器是大端还是小端为何要有字节序字节序转换函数需要字节序转换的时机例子一例子二2- IP地址转换函数早期(不用管)举例现在与字节序转换函数相比:**…...
PVE硬件直通之强制IOMMU分组
文章目录检查是否直接支持IOMMU分组配置IOMMU分组不直接支持的需要更新内核参考检查是否直接支持IOMMU分组 下面 以SATA控制器为例,看pci设备是否可以直接支持IOMMU分组 /* 打印pci设备详细信息*/ lspci -vv /* 找到SATA controller 段落*/ 16:00.1 SATA controll…...
深入讲解Kubernetes架构-node
Kubernetes 通过将容器放入在节点(Node)上运行的 Pod 中来执行你的工作负载。 节点可以是一个虚拟机或者物理机器,取决于所在的集群配置。 每个节点包含运行 Pod 所需的服务; 这些节点由控制面负责管理。通常集群中会有若干个节点…...
XSS-labs-master
XSS 经典14关这边先说一下常用的弹窗手法<script>alert(1)</script> <script>confirm(1)</script> <script>alert(1)</script> <script>alert(/1/zyl)</script> <script>alert(document.cookie)</script> <scr…...
「可信计算」助力TLS 传输更安全
序言背景(Satuation):TLS 是 TCP/IP 上的传输层安全协议,保护着数以亿万级的数据安全,我们在浏览器中输入的 https,就是受到 TLS 保护的。冲突(complication):从可信计算…...
链表学习基础
链表 通过指针串联在一起的线性结构,每个节点由数据域和指针域两部分组成。链表节点在内存中的存储通常不是连续的,各节点通过指针连接在一起,其内存分布大致如下图所示。 定义 单链表 struct ListNode {// DATATYPE 可以是任意存放数据的…...
springboot整合阿里云oss文件服务器
springboot整合阿里云oss文件服务器一、申请Bucket二、 获取AccessKey ID、AccessKey Secret三、 springboot整合3.1 在application.yml 配置参数3.2 oss需要的pom3.3 配置 oss配置类3.4 oss的controller类3.5 oss的service类以及impl一、申请Bucket 进入该网址对象存储oss述 …...
数据分析:旅游景点销售门票和消费情况分析
数据分析:旅游景点销售门票和消费情况分析 文章目录数据分析:旅游景点销售门票和消费情况分析一、前言二、数据准备三、分析数据四、用户购买门票数量分析五、用户复购分析六、用户回购分析七、占比分析1.每个月分层用户占比情况。2.每月不同用户的占比3…...
Android问题解决方案(一):Android 打空包后提示没有”android:exported“的属性设置
Android 打空包后提示没有”android:exported“的属性设置Android 打空包后提示没有”android:exported“的属性设置1、问题:2、文档3、参考链接:4、解决方案:Android 打空包后提示没有”android:exported“的属性设置 1、问题: …...
Portraiture2023最新版人像图像后期处理软件
2023全新发布Portraiture 4是专注于图像后期处理软件研发的 Imagenomic, LLC产品之一,在摄影爱好者中有点影响力。Portraiture可以将繁琐复杂的人像磨皮操作极致简化,不论是普通爱好者或专业后期处理人员,均能一键完成。凭借优秀的AI算法和多…...
链表OJ(七)删除有序链表中重复的元素-I -II
目录 删除有序链表中重复的元素-I 删除有序链表中重复的元素-II 删除有序链表中重复的元素-I 描述 删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次 例如: 给出的链表为1→1→21→1→2,返回1…...
C语言经典编程题100例(81~100)
目录81、习题7-7 字符串替换82、习题8-10 输出学生成绩83、习题8-2 在数组中查找指定元素84、习题8-3 数组循环右移85、题8-9 分类统计各类字符个数86、习题9-2 计算两个复数之积87、习题9-6 按等级统计学生成绩88、习题11-1 输出月份英文名89、习题11-2 查找星期90、练习10-1 …...
ChIP-seq 分析:数据质控实操(5)
1. 数据 今天将继续回顾我们在上一次中研究的 Myc ChIPseq。这包括用于 MEL 和 Ch12 细胞系的 Myc ChIPseq 及其输入对照。 可在此处[1]找到 MEL 细胞系中 Myc ChIPseq 的信息和文件可在此处[2]找到 Ch12 细胞系中 Myc ChIPseq 的信息和文件可以在此处[3]找到 MEL 细胞系的输入…...
java黑马头条 day5自媒体文章审核 敏感词过滤算法DFA 集成RabbitMQ实现自动审核
自动审核流程介绍 做为内容类产品,内容安全非常重要,所以需要进行对自媒体用户发布的文章进行审核以后才能到app端展示给用户。2 WmNews 中status 代表自媒体文章的状态 status字段:0 草稿 1 待审核 2 审核失败 3 人工审核 4 人工审核通过 …...
python--matplotlib(1)
前言 Matplotlib画图工具的官网地址是 http://matplotlib.org/ Python环境下实现Matlab制图功能的第三方库,需要numpy库的支持,支持用户方便设计出二维、三维数据的图形显示。 正文 1.arange函数 arange函数需要三个参数,分别为起始点、终止…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
