目录
图像在 OpenCV 中以二维或三维数组表示,数组中的每一个值就是图像的像素值。善于操作数组的 NumPy 模块就成了 OpenCV 的依赖包。OpenCV 中很多操作都要依赖 NumPy 模块,例如创建纯色图像、创建掩模和创建卷积核等。本节将简单介绍 NumPy 模块的常用操作方法,并演示如何利用 NumPy 模块创建图像。
NumPy(见图 4.9)更像是一个魔方(见图 4.10),它是 Python 数组计算、矩阵运算和科学计算的核心库,NumPy 来源于 Numerical 和 Python 两个单词。NumPy 提供了一个高性能的数组对象,以及可以轻松创建一维数组、二维数组和多维数组等大量实用方法,帮助开发者轻松地进行数组计算,从而广泛地应用于数据分析、机器学习、图像处理和计算机图形学、数学任务等领域中。由于 NumPy 是由 C 语言实现的,所以其运算速度非常快。具体功能如下。
在对数组进行基本操作前,首先了解一下 NumPy 的数据类型。NumPy 比 Python 增加了更多种类的数值类型,如表 4.1 所示,为了区别于 Python 数据类型,NumPy 中的 bool、int、float、complex 等数据类型名称末尾都加了短下画线「_」。
NumPy 提供了很多创建数组的方法,下面分别介绍。
1.最常规的 array()方法
numpy.array(object, dtype, copy, order, subok, ndmin)
.创建用 0 填充的数组
zeros()
创建纯 1 数组
ones()
创建随机数组
randint()
加法运算
减法和乘除法运算
幂运算
比较运算
使用 NumPy 创建 2 个数组,分别使用「>=」「==」「<=」和「!=」运算符比较 2 个数组
复制数组
n2 = np.array(n1, copy=True)
创建纯白图像。
- import cv2
- import numpy as np
-
- width=200
- height=100
- image=np.zeros((height,width))
- image[:100,:200]=255
- cv2.imshow('img',image)
- cv2.waitKey(0)
创建纯黑图片
可以将上述代码的255改成0
- import cv2
-
- import numpy as np
-
- width=600
- height=400
-
- img=np.zeros((width,height))
- img[100:200,100:200]=255
- cv2.imshow('img',img)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- import cv2
- import numpy as np
-
- width=200
- height=100
-
- img=np.random.randint(256,size=(height,width),dtype=np.uint8)
- cv2.imshow('img',img)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
彩色斑点只需要将二维改成三维就行
水平拼接数组
array = numpy.hstack(tup)
垂直拼接数组
array = numpy.vstack(tup)
色彩是人类的眼睛对于不同频率的光线的不同感受,不同频率的光线既是客观存在的又是人类主观感知的。为了表示这些不同频率的光线的色彩,人类建立了多种色彩模型,把这些色彩模型称作色彩空间。OpenCV 中的 BGR 色彩空间有 3 个通道,即表示蓝色的 B 通道、表示绿色的 G 通道和表示红色的 R 通道。本章将具体讲解色彩空间和通道,以及二者之间的紧密联系。
虽然 Photoshop 把一幅彩色图像的色彩空间默认为 RGB 色彩空间,但是 OpenCV 把一幅彩色图像的色彩空间默认为 BGR 色彩空间,这是因为 OpenCV 拆分一幅彩色图像的通道后,默认的通道顺序是 B→G→R。熟悉了 BGR 色彩空间后,本节将结合如图 5.1 所示的图像(本书彩色图像见资源包),介绍另外两个比较常见的色彩空间:GRAY 色彩空间和 HSV 色彩空间。
1.什么是 GRAY 色彩空间
GRAY 色彩空间通常指的是灰度图像,灰度图像是一种每个像素都是从黑到白,被处理为 256 个灰度级别的单色图像。这 256 个灰度级别分别用区间[0,255]中的数值表示。其中,「0」表示纯黑色,「255」表示纯白色,0~255 的数值表示不同亮度(即色彩的深浅程度)的深灰色或者浅灰色。因此,一幅灰度图像也能够展现丰富的细节信息,如图 5.2 所示。
dst = cv2.cvtColor(src, code)
说明
虽然色彩空间类型转换是双向的,而且 OpenCV 也提供了 cv2.COLOR_GRAY2BGR(从 GRAY 色彩空间转换到 BGR 色彩空间)和 cv2.COLOR_ BGR2GRAY(从 BGR 色彩空间转换到 GRAY 色彩空间)2 个色彩空间转换码,但是灰度图像是无法转换成彩色图像的。这是因为在彩色图像转换成灰度图像的过程中,丢失了颜色比例(即红色、绿色和蓝色之间的混合比例)。这些比例一旦丢失,就再也找不回来了。
1.什么是 HSV 色彩空间
BGR 色彩空间是基于三基色而言的,三基色指的是红色、绿色和蓝色。而 HSV 色彩空间则是基于色调、饱和度和亮度而言的。
其中,色调(H)是指光的颜色,例如,彩虹中的赤、橙、黄、绿、青、蓝、紫分别表示不同的色调,如图 5.4 所示。在 OpenCV 中,色调在区间[0,180]内取值。例如,代表红色、黄色、绿色和蓝色的色调值分别为 0、30、60 和 120。
饱和度(S)是指色彩的深浅。在 OpenCV 中,饱和度在区间[0,255]内取值。当饱和度为 0 时,图像将变为灰度图像
在 BGR 色彩空间中,图像的通道由 B 通道、G 通道和 R 通道构成。本节将介绍如何使用 OpenCV 提供的方法拆分和合并通道。
拆分一幅 BGR 图像中的通道
当使用 split()方法拆分一幅 BGR 图像中的通道时,split()方法的语法如下:
b, g, r = cv2.split(bgr_image)
拆分一幅 HSV 图像中的通道
h, s, v = cv2.split(hsv_image)
合并 B 通道图像、G 通道图像和 R 通道图像
当使用 merge()方法按 B→G→R 的顺序合并通道时,merge()方法的语法如下:
bgr = cv2.merge([b, g, r])
- import cv2
- image=cv2.imread('dog/gou .jpg')
- image_cv2=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
- h,s,v=cv2.split(image_cv2)
- #h[:,:]=180
- #v[:,:]=255
- s[:,:]=255
- image_cv2Y=cv2.merge((h,s,v))
- cv2.imshow('y',image_cv2Y)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- import numpy as np
- import cv2
- image=cv2.imread('dog/gou .jpg')
- image_hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
- #cv2.imshow('dog',image_hsv)
- b,g,r=cv2.split(image)
- h,s,v=cv2.split(image_hsv)
- # cv2.imshow('h',h)
- # cv2.imshow('s',s)
- # cv2.imshow('v',v)
- # cv2.imshow('b',b)
- # cv2.imshow('g',g)
- # cv2.imshow('r',r)
- image1=cv2.merge((b,g,r))
- cv2.imshow('image',image1)
- cv2.waitKey(0)
-
- # cv2.destroyAllWindows()
BGR 色彩空间包含了 3 个通道,即 B 通道、G 通道和 R 通道。OpenCV 在 BGR 色彩空间的基础上,又增加了一个用于设置图像透明度的 A 通道,即 alpha 通道。这样,形成一个由 B 通道、G 通道、R 通道和 A 通道 4 个通道构成的色彩空间,即 BGRA 色彩空间。在 BGRA 色彩空间中,alpha 通道在区间[0,255]内取值;其中,0 表示透明,255 表示不透明。