【opencv 系列】第3章 图像的8种变换

news2024/12/28 10:26:33

文章目录

  • 前言
  • 上代码
    • 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理解起来都有点难度,是因为应用空间比较少,你也能知道怎么实现,但不知道用在哪。

  1. 图像放大、缩小;cv2.resize(img, None,fx=0.5,fy=0.5,interpolation=cv2.INTER_LINEAR) cv2.resize(img, (width2, height2), interpolation=cv2.INTER_LINEAR)
  2. 图像平移; cv2.warpAffine()
  3. 图像旋转;
  4. 图像仿射变换;
  5. 图像裁剪;
  6. 图像的位运算(AND, OR, XOR);
  7. 图像的分离和融合;
  8. 图像的颜色空间;

本章节内容适合在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)

在这里插入图片描述

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

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

相关文章

Linux设备驱动模型与 sysfs实现分析

RTOS和Linux系统上开发驱动的方式非常的不同,在RTOS系统下,驱动和驱动之间并没有实质性的联系,不同的驱动和BSP之间仅仅通过一层很薄很薄的设备管理框架聚合在一起构成RTOS的设备管理子系统。图形化表示如下: 设备驱动&BSP之间互相独立,互不影响,互不依赖,独立实现,…

Damask和abaqus晶体塑性联合仿真培训通知

一 软件介绍 DAMASK 是一个统一的多物理晶体塑性模拟包。连续体力学边值问题的求解需要连接每个材料点的变形和应力的本构响应,该问题在 DAMASK 中基于晶体可塑性使用各种本构模型和均质化方法能够被有效解决。除此之外,孤立地处理力学已不足以研究新兴的先进高强度…

nodejs基于vue微信小程序的水库巡检系统

功能介绍 将系统权限按管理员和用户这两类涉及用户划分。 (a) 管理员:管理员使用本系统涉到的功能主要有:个人中心、用户管理、巡检管理、检查管理、反馈交流、系统管理等功能 (b)用户进入系统前台可以实现首页、我的、巡检、检查、反馈交流、地图等功能…

2019蓝桥杯真题矩阵切割(填空题) C语言/C++

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。 当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正…

「设计模式」代理模式

「设计模式」代理模式 文章目录「设计模式」代理模式一、概述二、结构三、静态代理四、 JDK动态代理五、CGLIB动态代理六、三种代理的对比优缺点使用场景一、概述 代理模式是一种应用很广泛的结构型设计模式,而且变化很多。在代理模式中引入了一个新的代理对象&…

面试攻略,Java 基础面试 100 问(十一)

抽象类(abstract class)和接口(interface)有什么异同? 抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现&#xff…

JavaEE-HTTP协议完结认识HTTPS协议

目录回顾构造HTTP请求(客户端)基于 HTML和JS基于 form表单基于 ajax基于 Java基于socket认识HTTPS加密对称加密非对称加密回顾 让我们回顾一下HTTP协议中的请求和响应 构造HTTP请求(客户端) 基于 HTML和JS 基于 form表单 核心HTML标签,就是form标签 form ( 表单…

RocketMQ5.0.0消息存储<五>_文件过期删除机制

目录 一、概览 二、过期文件删除机制 三、参考资料 一、概览 RocketMQ操作CommitLog、ConsumeQueue文件是基于内存映射机制并在启动时会加载commitlog、consumequeue目录下的所有文件,为了避免内存与磁盘的浪费,不可能将消息永久存储Broker服务器上&a…

2023/02/18 ES6数组的解读

1 扩展运算符 扩展运算符(spread)是三个点(…). 它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5该运算符主要用于…

比较全面的HTTP和TCP网络传输的单工、全双工和半双工

文章目录单工、全双工、半双工1. 单工2. 半双工3. 全双工HTTP协议的工作模式TCP协议的工作模式本文参考: 图解网络传输单工、半双工、全双工 - 知乎 (zhihu.com) 问:HTTP是单工的还是双工的还是半双工的 - 简书 (jianshu.com) 关于TCP全双工模式的解释_忙…

大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——InputFormat数据输入

3.1.1切片与MapTask并行度决定机制 1、问题引出 MapTask的并行度决定Map阶段的任务处理并发度,进而影响到整个Job的处理速度。 思考:1G的数据,启动8个MapTask,可以提高集群的并发处理能力。那么1K的数据,也启动8个M…

华为OD机试 - 机器人走迷宫(JS)

机器人走迷宫 题目 房间有X*Y的方格组成,例如下图为6*4的大小。每一个放个以坐标(x,y)描述。 机器人固定从方格(0,0)出发,只能向东或者向北前进, 出口固定为房间的最东北角,如下图的方格(5,3)。 用例保证机器人可以从入口走到出…

算法:(十四)动态规划

文章目录14.1 单序列问题面试题88:爬楼梯的最少成本面试题89:偷盗房屋面试题90:环形偷盗房屋面试题91:粉刷房子面试题92:反转字符面试题93:最长斐波那契数列面试题94:最少回文分割14.2 双序列问题面试题95&…

2023美国大学生数学建模竞赛A题详细公式和代码分享

目录 2023美赛A题翻译 1.1 建立一个数学模型,预测一个植物群落在各种不规则的天气周期中如何随时间变化。包括本该降水充足的干旱时期。该模型应考虑到干旱周期中不同物种之间的相互作用。 1.2就植物群落与大环境的长期相互作用,探讨你能从你的模型中…

【Python从入门到进阶】8、Python的输入输出

接上篇《7、运算符》 上一篇我们学习了Python的运算符部分,包括算数运算符、赋值运算符、比较运算符、逻辑运算符等。本篇我们来学习Python的输入和输出相关内容。 一、输出 其实输出的含义就是在控制台里打印一些东西,我们在之前已经做过很多的“prin…

社招前端必会手写面试题集锦

查找字符串中出现最多的字符和个数 例: abbcccddddd -> 字符最多的是d,出现了5次 let str "abcabcabcbbccccc"; let num 0; let char ;// 使其按照一定的次序排列 str str.split().sort().join(); // "aaabbbbbcccccccc"// 定义正则表达…

IDEA插件安装慢、超时、不成功问题如何解决?

目录 一、打开国内插件的节点IP地址 二、修改本地hosts文件 三、刷新DNS缓存 一、打开国内插件的节点IP地址 国内插件的节点IP地址查询: http://tool.chinaz.com/speedtest/plugins.jetbrains.com 在下方的检测结果中,找到一个解析时间最短的IP地址,解…

流程引擎之Activiti简介

背景Activiti 是一个开源架构的工作流引擎,基于 bpmn2.0 标准进行流程定义,其前身是 jBPM,Activiti 相对于 jBPM 更轻量,更易上手,且天然集成了 Spring。2010年 jBPM 创始人 Tom Baeyens 离开 JBoss,随之加…

大数据之-Nifi-监控nifi处理数据的状态信息_处理数据的状态栏_组件统计_公告BUG信息---大数据之Nifi工作笔记0010

首先可以看到状态栏,可以提供活动现场的数量,排队统计信息,等等 可以看到在面板的最上面有一行状态栏,就是 就是具体的状态信息 然后组件统计就是具体的处理器的统计信息 可以看到这里pickup这个getfile处理器,可以看到in这里,说了文件的输入个数,以及大小 out是输出个数以及大…

Linux进程学习【二】

✨个人主页: Yohifo 🎉所属专栏: Linux学习之旅 🎊每篇一句: 图片来源 🎃操作环境: CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…