当前位置: 首页 > news >正文

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

  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.lryc.cn/news/12335.html

相关文章:

  • 【C语言刷题】倒置字符串
  • 用switch语句编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:
  • uboot编译分析
  • SpringCloud Alibaba集成Dubbo实现远程服务间调用
  • 网络编程(一)
  • PVE硬件直通之强制IOMMU分组
  • 深入讲解Kubernetes架构-node
  • XSS-labs-master
  • 「可信计算」助力TLS 传输更安全
  • 链表学习基础
  • springboot整合阿里云oss文件服务器
  • 数据分析:旅游景点销售门票和消费情况分析
  • Android问题解决方案(一):Android 打空包后提示没有”android:exported“的属性设置
  • Portraiture2023最新版人像图像后期处理软件
  • 链表OJ(七)删除有序链表中重复的元素-I -II
  • C语言经典编程题100例(81~100)
  • ChIP-seq 分析:数据质控实操(5)
  • java黑马头条 day5自媒体文章审核 敏感词过滤算法DFA 集成RabbitMQ实现自动审核
  • python--matplotlib(1)
  • 华为OD机试题 - 获取最大软件版本号(JavaScript)
  • 字符函数和字符串函数
  • 【猜名次】-C语言-题解
  • 对 equals() 和 hashCode() 的理解?
  • IDEA插件安装慢、超时、不成功问题如何解决?
  • 软考高级之信息系统案例分析七重奏-《5》
  • JUC并发编程 Ⅳ -- 共享模型之无锁
  • Spring之AOP实现
  • Spring之基于xml的自动装配、基于Autowired注解的自动装配
  • 【案例】--(非分布式)轻量级任务调度平台
  • key的作用原理与列表的遍历、追加、搜索、排序