目录
使用 NumPy 模块操作像素
NumPy 概述
数组的类型
创建数组
操作数组
切片操作就不学了python笔记中已提
创建图像
黑中有白
斑点图
拼接图像
色彩空间与通道
色彩空间
GRAY 色彩空间
HSV 色彩空间
通道
拆分通道
合并通道
alpha 通道
图像在 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 表示不透明。