1. 引言

本文通过导入函数库、读取图像、转换图像色彩空间、缩放图像和保存图像五个步骤详细讲解了使用opencv-python库和Numpy库操作并保存图像的基本过程。

运行本文所讲解程序需要如下环境准备:

  1. 已有Python虚拟环境,并安装了opencv-python库、numpy库和matplotlib库;
  2. 已有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计算机视觉入门之图像色彩空间转换的更多相关文章

  1. python实现色彩空间转换

    目录: (一)调用转换函数实现图像色彩空间转换------ cv2.cvtColor函数 (二)色彩空间转换,利用inrange函数过滤视频中的颜色,实现跟踪某一颜色 正文: (一)调用转换函数实现图 ...

  2. OpenCV计算机视觉学习(1)——图像基本操作(图像视频读取,ROI区域截取,常用cv函数解释)

    1,计算机眼中的图像 我们打开经典的 Lena图片,看看计算机是如何看待图片的: 我们点击图中的一个小格子,发现计算机会将其分为R,G,B三种通道.每个通道分别由一堆0~256之间的数字组成,那Ope ...

  3. OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...

  4. OpenCV计算机视觉学习(13)——图像特征点检测(Harris角点检测,sift算法)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 前言 ...

  5. OpenCV计算机视觉学习(11)——图像空间几何变换(图像缩放,图像旋转,图像翻转,图像平移,仿射变换,镜像变换)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 图像 ...

  6. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  7. Python+OpenCV图像处理(四)—— 色彩空间

    一.色彩空间的转换 代码如下: #色彩空间转换 import cv2 as cv def color_space_demo(img): gray = cv.cvtColor(img, cv.COLOR ...

  8. Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别

    Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别 1.1. 色彩的三要素 -- 色相.明度.纯度1 1.2. YUV三个字母中,其中"Y&quo ...

  9. opencv编程入门技巧

    opencv编程入门技巧 最近在项目中负责图像处理模块的编程工作,主要分为两个板块,一是视频图像去雾,二是可视.红外图像融合.为了提升开发效率,遂开始学习并使用opencv图像类库,效果很好的说~因为 ...

  10. OpenCV计算机视觉实战(Python版)资源

    疲劳检测 pan.baidu.com/s/1Ng_-utB8BSrXlgVelc8ovw #导入工具包 from scipy.spatial import distance as dist from ...

随机推荐

  1. KingbaseES 实现 MySQL 函数 last_insert_id

    用户从mysql迁移到金仓数据库过程中,应用中使用了mysql函数last_insert_id()来获取最近insert的那行记录的自增字段值. mysql文档中关于函数的说明和例子: LAST_IN ...

  2. 第一次画pcb学到的知识

    第一次画pcb学到的知识 1. Typec (6针) 其中的CC1.CC2引脚为快充协议的引脚,用不到的时候串个5.1K的电阻接地s 2. AMS117降压电路 AMS1117芯片的输入电压都要一个1 ...

  3. windows系统cmd切换盘符路径命令失效

    问题描述:比如当我在C盘想切换到D盘的某个文件夹路径下时 只是输出了那个路径 但是并没有真的切换 这时候需要再多操作一步就会成功了

  4. Python flask框架 request.json和request.form的区别

    一.fetch请求时,request.json能获取到数据,request.form获取不到数据 1 var data = {'name':'test'}; 2 3 fetch('http://loc ...

  5. #0/1分数规划#AT1807 食塩水

    题目 从\(n\)对数\((w_i,p_i)\)中选择\(k\)对使得 \[\frac{\sum_{i=1}^k w'_i*p'_i}{\sum_{i=1}^k w'_i} \] 最大 分析 若可行解 ...

  6. Node 项目通过 .npmrc 文件指定依赖安装源

    背景 npm 命令运行时,往往通过命令行指定相关配置,最常用的便是使用 --registry 来指定依赖的安装源. npm install --registry=https://registry.np ...

  7. MyBatis resultMap中collection过滤空字段

    在使用MyBatis查询数据时,返回值可以定义为resultMap. 如果返回的对象中有列表,还可以使用collection标签进行定义. 此时,如果不想某些字段为空的数据加入列表,可以使用notNu ...

  8. HDD与你相约深圳,一起探讨创新开发与运营增长

    12月14日,HUAWEI Developer Day(以下简称HDD)将在深圳与广大开发者见面.本次HDD共设有主论坛.两个分论坛及两个闭门会议,期待各位开发者前来参加. 精彩预告 01·主论坛 在 ...

  9. openGauss中的sequence跟Oracle的sequence有什么区别?

    openGauss 中的 sequence 跟 Oracle 的 sequence 有什么区别? openGauss 中也提供了 sequence 序列功能,使用 Oracle 的用户应该都非常喜欢使 ...

  10. 深入解析decltype和decltype(auto)

    decltype关键字是C++11新标准引入的关键字,它和关键字auto的功能类似,也可以自动推导出给定表达式的类型,但它和auto的语法有些不同,auto推导的表达式放在"="的 ...