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 V8R6 备份恢复案例 -- sys_rman备份“DSO support..."故障

    案例说明: 在通过sys_rman执行备份时,出现"DSO support...."错误,如下图所示: sys_log日志: 适用版本: KingbaseES V8R6 一.问题分 ...

  2. KingbaseES Json 系列五--Json数据操作函数三

    KingbaseES Json 系列五:Json数据操作函数三(JSONB_SET,JSONB_INSERT,JSON_QUERY) JSON 数据类型是用来存储 JSON(JavaScript Ob ...

  3. 2024最新最全Java和Go面经,面试了30多场,终于上岸了!

    ​> 本文来自我们技术交流群群友的投稿,未经授权,禁止转载. 原文链接:太难了,Java和Go,面试了30多场,终于上岸了! 先听一下TA的故事 2023年10月份我就做好了离职跳槽的准备,做了 ...

  4. #威佐夫博弈#洛谷 2252 [SHOI2002]取石子游戏

    题目 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子. 游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子: 二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完 ...

  5. OpenAtom OpenHarmony分论坛,今天14:00见!附大事记精彩发布

    2022开放原子全球开源峰会 OpenAtom OpenHarmony分论坛 万物互联,使能千行百业 整装待发!精彩今日揭晓与您相约7月27日 14:00  

  6. 民生直销银行终端安全修炼秘籍之HMS Core两大安全能力

    在金融行业数字化转型浪潮下,传统商业银行先后推出手机银行.直销银行等移动金融客户端.作为民生银行"数字金融"的试验田,民生直销银行始终秉承"简单的银行"发展理念 ...

  7. 每日一题--Python打印金字塔

    def day1(num): s = 'abcdefghijklmnopqrstuvwxyz' * (num // 26 + 1) for i in range(1, num + 1): print( ...

  8. MogDB 安装解压错误:cannot run bzip2: No such file or directory

    MogDB 安装解压错误:cannot run bzip2: No such file or directory 本文出处:https://www.modb.pro/db/403662 问题症状 Mo ...

  9. 深入理解MD5算法:原理、应用与安全

    第一章:引言 导言 在当今数字化时代,数据安全和完整性变得至关重要.消息摘要算法是一种用于验证数据完整性和安全性的重要工具.在众多消息摘要算法中,MD5(Message Digest Algorith ...

  10. sql 语句系列(闰年)[八百章之第十九章]

    前言 判断闰年还是挺有用的. mysql select DAY(LAST_DAY(DATE_ADD(CURRENT_DATE,INTERVAL -DAYOFYEAR(CURRENT_DATE)+1+3 ...