本文正在参与 人工智能创作者扶持计划
OpenCV入门(三)快速学会OpenCV2图画处理根底
1.色彩改换cvtColor
imgproc的模块名称是由image(图画)和process(处理)两个单词的缩写组合而成的,是重要的图画处理模块,主要包括图画滤波、几许改换、直方图、特征检测与方针检测等。
这个模块包含一系列的常用图画处理算法,相对而言,imgproc是OpenCV一个比较复杂的模块。OpenCV中的一些画图函数也归于这个模块。
色彩改换是imgproc模块中一个常用的功用。 咱们生活中大多数看到的彩色图片都是RGB类型的,但是在进行图画处理时需求用到灰度图、二值图、HSV、HSI等色彩制式,OpenCV供给了cvtColor()函数来完成这些功用。 这个函数用来进行色彩空间的转化,跟着OpenCV版别的升级,关于色彩空间品种的支持越来越多,触及不同色彩空间之间的转化,比方RGB和灰度的互转、RGB和HSV(六角锥体模型,这个模型中色彩的参数分别是色彩H、饱和度S、明度V)的互转等。 cvtColor函数声明如下:
cvtColor(src, code[, dst[, dstCn]])
其中, 参数src表明输入图画,即要进行色彩空间改换的原图画,能够是数组矩阵; code表明色彩空间转化代码,即在此确定将什么制式的图片转化成什么制式的图片;dst表明输出与src相同巨细和深度的图画,即进行色彩空间改换后存储图画; dstCn表明方针图画通道数,默许取值为0,假如参数为0,则从src和代码主动获得通道的数量。 函数cvtColor的作用是将一个图画从一个色彩空间转化到另一个色彩空间,但是从RGB向其他类型转化时必须明确指出图画的色彩通道。 值得注意的是,在OpenCV中,其默许的色彩制式排列是BGR而非RGB。关于24位色彩图画来说,前8位是蓝色,中心8位是绿色,最终8位是红色。 需求注意的是,cvtColor函数不能直接将RGB图画转化为二值图画,需求借助threshold函数。 另外,假如对8-bit图画使用cvtColor()函数进行转化将会丢掉一些信息。咱们常用的色彩空间转化有两种:将BGR转化为Gray或HSV。
下面看一个比方,将图片转化为灰度图和HSV。
import cv2
#将图片转化为灰度图
src_image = cv2.imread("test.jpg")
gray_image = cv2.cvtColor(src_image, cv2.COLOR_BGR2GRAY)
#将图片转化为HSV
hsv_image = cv2.cvtColor(src_image, cv2.COLOR_BGR2HSV)
cv2.imshow("src_image", src_image)
cv2.imshow("gray_image", gray_image)
cv2.imshow("hsv_image", hsv_image)
cv2.waitKey(0)
首要读取工程目录下的图片test.jpg,然后调用cvtColor函数将原图转为灰度图,再调用cvtColor函数将原图转为HSV图,最终将3幅图片显现出来。
运行实例,成果如图所示。
2.截取图画
2.1切片和索引
现在咱们把磁盘上的一幅图片文件读到内存中,比方:
img = cv.imread("p1.jpg"); #读取一幅图片
实际上是一个NumPy包的array数组,它包含着每个像素点的数据。因此了解NumPy是操作图画数据的根底。NumPy是Python中用于数据分析、机器学习、科学核算的重要软件包。它极大地简化了向量和矩阵的操作及处理。Python中的不少数据处理软件包依赖于NumPy作为其根底架构的中心部分(例如scikit-learn、SciPy、Pandas和TensorFlow)
NumPy包供给了两种根本目标:ndarray(N维数组)和func(通用函数)。ndarray数组用来寄存相同数据类型的多维数组,func是能够对数组进行运算处理的函数。
ndarray目标的内容能够经过索引或切片来访问和修改,与Python中list的切片操作相同。ndarray数组能够基于0~n的下标进行索引,切片目标能够经过内置的slice函数,并设置start、stop及step参数进行,从原数组中切割出一个新数组。比方:
a = np.arange(10)
s = slice(2,7,2) #从索引2开端到索引7中止,距离为2
print (a[s])
输出成果为:[2 4 6]。
在以上实例中,首要经过arange()函数创建ndarray目标。然后分别设置开始、中止和步长的参数为2、7、2。咱们也能够经过冒号分隔切片参数start:stop:step来进行切片操作:
a = np.arange(10)
b = a[2:7:2] #从索引2开端到索引7中止,距离为2
print(b)
输出成果为:[2 4 6]。
其中,有关冒号的解说是:假如只放置一个参数,如[2],就将返回与该索引相对应的单个元素;假如为[2:],就表明从该索引开端今后的所有项都将被提取;假如使用了两个参数,如[2:7],那么提取两个索引(不包括中止索引)之间的项。
比方:
a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
b = a[5]
print(b)
输出成果为5。
比方:
a = np.arange(10)
print(a[2:])
输出成果为:[2 3 4 5 6 7 8 9]。
再比方:
a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
print(a[2:5])
输出成果为:[2 3 4]。
多维数组相同适用上述索引提取办法:
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print(a)
#从某个索引处开端切割
print('从数组索引 a[1:] 处开端切割')
print(a[1:])
输出成果为:
[[1 2 3]
[3 4 5]
[4 5 6]]
从数组索引 a[1:] 处开端切割
[[3 4 5]
[4 5 6]]
由于图画是数组形式所以咱们能够用切片进行截取图画,代码如下:
import cv2
#将图片转化成灰度图
src_image = cv2.imread("test.jpg")
print(src_image)
img=src_image[20:100,20:250]
cv2.imshow("cut",img)
cv2.waitKey(0)
cv2.destoryAllWindos()
输出成果:
3.获取色彩通道
cv2.split能够帮助咱们获取不同色彩通道。
声明如下:
cv2.split(img)
实例代码:
# 获取色彩通道
img = cv2.imread("picture.jpg") # 读取图片
b, g, r = cv2.split(img) # 分割色彩通道
print(r.shape, g.shape, b.shape) # 调试输出
输出成果:
(1263, 1920) (1263, 1920) (1263, 1920)
4.单通道显现
实例代码:
import cv2
src_image = cv2.imread("test.jpg")
cur_img=src_image.copy()#深复制
cur_img[:, :, 0] = 0 # B通道设置为0
cur_img[:, :, 1] = 0 # G通道设置为0
cv2.imshow("B channel", cur_img) # 图片展示
cv2.waitKey(0)
cv2.destoryAllWindos()
输出成果: