【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函数需要三个参数,分别为起始点、终止…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
