OpenCV计算机视觉入门之图像色彩空间转换
1. 引言
本文通过导入函数库、读取图像、转换图像色彩空间、缩放图像和保存图像五个步骤详细讲解了使用opencv-python库和Numpy库操作并保存图像的基本过程。
运行本文所讲解程序需要如下环境准备:
- 已有Python虚拟环境,并安装了opencv-python库、numpy库和matplotlib库;
- 已有Python虚拟环境可支持Jupyter Notebook运行。
2. 概念
2.1 数字图像
计算机视觉技术的作用对象是数字图像,数字图像由有限数量的元素组成,每个元素都有一个特定的位置和数值,这些元素也被称之为像素。在计算机中,图像数据是由数值矩阵的方式保存的,矩阵中的位置和数值与图像的像素点一一对应。
2.2 色彩空间
计算机中有多种色彩模型,以一维、二维至多维空间坐标来表示某一色彩,空间坐标系统所能定义的色彩范围即是色彩空间。常用的色彩空间主要有 RGB、HSL以及HSV等,不同的工业环境或视觉应用所使用的色彩空间不尽相同,因此,色彩空间转换经常在计算机视觉任务中的预处理环节出现。
3. 实践-图像读取
(1)导入函数库
首先要导入opencv-python库、numpy库和matplotlib库。“%matplotlib inline”表示要将图像在Jupyter Notebook的行内显示。
# 导入函数库
import cv2
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
(2)指定读取图像路径
图像文件通常是保存在本地的,在读取图像时要明确图像的路径。最简单的指定图像路径的方式是直接赋值。示例中,将数据类型为字符串的图像相对路径赋值给imagePath变量。
# 指定图像路径
imagePath = './test.png'
[!notice] 提示-相对路径于绝对路径的辨析:
绝对路径就是文件的真正存在的路径,是从系统根目录开始的文件的完整路径。
相对路径是以某个目录为起点,相对于这个起点的路径,比如:
a) …/ 表示当前文件所在的目录的上一级目录
b) ./ 表示当前文件所在的目录(可以省略)
(3)使用imread()函数读取图像并保存到image变量中
imread()函数的格式为“cv2.imread(图片路径,读取方式)”,该方法方法从指定的文件加载图像。如果无法读取图像(由于缺少文件, 权限不正确, 格式不受支持或格式无效), 则此方法将返回一个空矩阵。imread()函数有“图片路径”和“读取方式”两个参数。其中,“图片路径”为要读取的图片在计算机中的保存位置,“读取方式”如下三种:
- cv2.IMREAD_COLOR:以彩色图片模式读取图像,此选项为默认参数。
- cv2.IMREAD_GRAYSCALE:以灰度模式读取图像。
- cv2.IMREAD_UNCHANGED:包括alpha的模式读取图像。
本任务示例中没有指定读取方式,程序会以默认的彩色图片模式读取。读取后的图像显示如图1所示。
image = cv2.imread(imagePath)
plt.imshow(image)
在OpenCV中,图像不是默认按通常的 RGB颜色通道读取的,而是按BGR的通道顺序存储的。因此,直接使用matplotlib的imshow()函数显示图像会发现显示的颜色是不正确的。
(4)转换通道排列
要显示正确的图像色彩,还需要进行色彩空间转换操作。Opencv库提供了cvtColor()函数来实现图像的色彩空间转换。在读取了原始图像之后,使用cvtColor()函数可以实现将按照BGR通道排列的图像转换为按RGB排列。代码中的“cv2.COLOR_BGR2RGB”指定了转换方式,“BGR2RGB”可以简单理解为“BGR to RGB”,也就是将图像从BGR色彩空间转换为RGB色彩空间的意思。常见的转换方式还有“cv2.COLOR_BGR2GRAY”、 “cv2.COLOR_GRAY2BGR”等,通过其命名方式即可以知道其指定的转换方式。转换后的图像颜色通道数与转换方式是一致的,比如,灰度图像是单通道的,所以使用“cv2.COLOR_BGR2GRAY”转换的图像就应该是单通道的。进行通道转换后的图像显示如图2所示,变换了通道顺序后的图像显示是正确的了。
image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
plt.imshow(image)
(5)缩放图像
cv2.resize()函数用于图像的缩放操作,其模版如下:
cv.resize(图像地址, 缩放后的图像大小, 目标图像, X轴缩放比例, Y轴缩放比例, 插值方法)
以下程序示例中,目标图像参数设置为None,X轴缩放比例和Y轴缩放比例均设置为0.005,插值方法未指定,程序会使用默认的插值方法cv2.INTER_LINEAR。缩放后的图像如图3所示。
image = cv2.resize(image, None, fx=0.005, fy=0.005)
plt.imshow(image)
(6)保存图像
为了更好的理解图像的像素,本任务最后要将图片保存到CSV文件中。保存的CSV文件可以用Excel或Numbers软件打开,图像的每个像素值会被写入到相应的方格中。使用np.savetxt()方法可以实现将图像保存为CSV文件,np.savetxt()方法的模版如下所示:
numpy.savetxt(文件名, 要保存的数据)
如下示例代码中,指定了要保存的CSV文件名为“new.csv”,要保存的矩阵数据对象为“image”,delimiter = ‘,’表示使用逗号分隔字符,fmt = “%d”表示数值以整数形式保存。保存后的CSV文件部分表格如表1所示。
# 将图像矩阵保存为csv文件
np.savetxt("new.csv", image, delimiter=",", fmt="%d")
下表展示了所保存的图像像素点矩阵,矩阵大小为47 x 18,每一个方格都对应着图像的1个像素点。通过对照观察csv文件和示例图片找到像素点的对应关系,读者对于图像像素的概念以及数字图像在计算机中的保存方式的理解应该更深入了。
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
143 |
255 |
255 |
255 |
255 |
… |
… |
143 |
255 |
255 |
255 |
255 |
… |
… |
143 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
147 |
147 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
255 |
255 |
255 |
… |
… |
255 |
255 |
[!notice] 提示:image的变量类型
使用type( )函数可以输出image的变量类型,通过如下代码的运行结果可以看出,image的变量类型为一个numpy的ndarry对象。NumPy 的 ndarray 是一个(通常是固定大小)由相同类型和大小的数据组成的多维容器。由此可知,使用imread()函数是将图像读取为多位数组,并且可以通过索引访问和修改其中的数值实现图像的变换效果。
image = cv2.imread(imagePath)
print(type(image))
输出:<class ‘numpy.ndarray’>
5. 完整代码
本文所讲解内容的完整代码如下所示。
# 导入函数库
import cv2
import numpy as np
# 指定图像路径
imagePath = './test.png'
# 读取为灰度图像
image = cv2.imread(imagePath, cv2.IMREAD_GRAYSCALE)
# 缩放图像
image = cv2.resize(image, None, fx=0.005, fy=0.005)
# 将图像矩阵保存为csv文件
np.savetxt("new.csv", image, delimiter=",", fmt="%d")
6. 总结
本文讲解了使用opencv-python库和Numpy库实现图像的读取、变换和保存操作过程。
OpenCV计算机视觉入门之图像色彩空间转换的更多相关文章
- python实现色彩空间转换
目录: (一)调用转换函数实现图像色彩空间转换------ cv2.cvtColor函数 (二)色彩空间转换,利用inrange函数过滤视频中的颜色,实现跟踪某一颜色 正文: (一)调用转换函数实现图 ...
- OpenCV计算机视觉学习(1)——图像基本操作(图像视频读取,ROI区域截取,常用cv函数解释)
1,计算机眼中的图像 我们打开经典的 Lena图片,看看计算机是如何看待图片的: 我们点击图中的一个小格子,发现计算机会将其分为R,G,B三种通道.每个通道分别由一堆0~256之间的数字组成,那Ope ...
- OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...
- OpenCV计算机视觉学习(13)——图像特征点检测(Harris角点检测,sift算法)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 前言 ...
- OpenCV计算机视觉学习(11)——图像空间几何变换(图像缩放,图像旋转,图像翻转,图像平移,仿射变换,镜像变换)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 图像 ...
- [OpenCV学习笔记3][图像的加载+修改+显示+保存]
正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...
- Python+OpenCV图像处理(四)—— 色彩空间
一.色彩空间的转换 代码如下: #色彩空间转换 import cv2 as cv def color_space_demo(img): gray = cv.cvtColor(img, cv.COLOR ...
- Atitit rgb yuv hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别
Atitit rgb yuv hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别 1.1. 色彩的三要素 -- 色相.明度.纯度1 1.2. YUV三个字母中,其中"Y&quo ...
- opencv编程入门技巧
opencv编程入门技巧 最近在项目中负责图像处理模块的编程工作,主要分为两个板块,一是视频图像去雾,二是可视.红外图像融合.为了提升开发效率,遂开始学习并使用opencv图像类库,效果很好的说~因为 ...
- OpenCV计算机视觉实战(Python版)资源
疲劳检测 pan.baidu.com/s/1Ng_-utB8BSrXlgVelc8ovw #导入工具包 from scipy.spatial import distance as dist from ...
随机推荐
- echarts 中国地图tooltip实现提示框
point: 鼠标位置,如 [20, 40]. params: 同 formatter 的参数相同. dom: tooltip 的 dom 对象. rect: 只有鼠标在图形上时有效,是一个用x, y ...
- 32位x86处理器编程架构
1. IA-32架构的基本执行环境 1.1 寄存器的扩展 为了在汇编语言程序中使用经过扩展(Extend) 的寄存器: 在32位模式下,为了生成32位物理地址,处理器需要使用32位的指令指针寄 ...
- 进程管理与 SELinux
进程管理与 SELinux 在 Linux 系统当中:『触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予 ...
- #贪心#CF840A Leha and Function
题目 设 \(f(n,k)\) 表示 区间 \([1,n]\) 选出 \(k\) 个元素的集合的期望最小值, 现在需要重排 \(a\) 数组,使得 \(\sum_{i=1}^mf(a_i,b_i)\) ...
- #cdq分治,树状数组#洛谷 5459 [BJOI2016]回转寿司
题目 求 \[\sum_{i=1}^n\sum_{j=i}^{n}[L\leq \sum_{k=i}^j a_k\leq R] \] 分析(树状数组) 考虑前缀和,改为是否有两个数的差在\([L\si ...
- #左偏树,树形dp#洛谷 1552 [APIO2012]派遣
题目 分析 那我指定管理层之后,选择薪水越小的人越好, 考虑小根堆,由于需要合并,所以采用左偏树 代码 #include <cstdio> #include <cctype> ...
- 两个专栏帮你搞定【图像拼接(image stitching)】
[图像拼接论文精读]专栏:图像拼接论文精读 [图像拼接源码精读]专栏:图像拼接论文源码精读 前言 图像拼接(image stitching)是计算机视觉中的高级图像处理手段,是一个小众方向,研究的人很 ...
- Windows开发的瑞士军刀,NewSPYLite发布
宗旨:延续了SpyLite的方便易用,同时也丰富了更多的功能,更适合开发者使用. 在SpyLite的基础功能上,开发了更多人性化并且好用的功能,增强的信息的可读性,以及软件总体的可用性. New Sp ...
- keycloak~网站对接到Keycloak的步骤
新网站对接到KC的部署 kc的环境 向kc申请自己的客户端 kc的登录接口 通过code换token接口 刷新token接口 kc的用户信息接口 kc的jwt token说明 1. kc的环境 测试环 ...
- C++调用Python-5:调用Python函数,传参数字+字符串
# mytest.py def myjoin(a, b): print("num a + str b") return f"{a}=={b}" #include ...