OpenCV中提供cvtColor()函数来进行色彩空间的转换。色彩空间种类较多,经常用到的有:RGB空间,HSI空间,Gray灰度空间,带alpha通道的RGB等等。需要注意的是OpenCV中所处理的RGB三通道的顺序为B,G,R。
上一篇我们说到RGB空间与灰度空间的互化,以及RGB与HSV的转化,这一回我们用cv中的函数来进一步理解色彩空间。
OpenCV中提供inRange(img, min, max))函数辅助我们进行掩膜操作。函数当中的img是图像矩阵,min,max为我们所给出的一个范围。在这个范围当中的所有值将会被强制转换为255,而不在该区域的所有值都将被转换成0
代码如下:
import cv2
import numpy as np
img=np.random.randint(0,256,size=[5,5],dtype=np.uint8)
min=100
max=200
mask = cv2.inRange(img, min, max)
print("img=\n",img)
print("mask=\n",mask)
实现效果如下:可以看到第一行第一列(超过设定范围200)第二行第一列(不足设定范围100)都被重新设定为了0。通过这种方式来达到掩膜的目的。
利用inRange()我们可以做到一个比较有趣的事,可以通过这样的一个函数来提取色彩。在了解了色彩空间之后我们知道RGB空间中是将红绿蓝三种颜色按照不同比例组合得到其他各种颜色。反过来我们就可以按照这个比例来提取颜色。
实现代码:
import cv2
import numpy as np
opencv=cv2.imread("opencv.jpg")
hsv = cv2.cvtColor(opencv, cv2.COLOR_BGR2HSV)
cv2.imshow('opencv',opencv)
#=============指定蓝色值的范围=============
minBlue = np.array([110,50,50])
maxBlue = np.array([130,255,255])
#确定蓝色区域
mask = cv2.inRange(hsv, minBlue, maxBlue)
#通过掩码控制的按位与,锁定蓝色区域
blue = cv2.bitwise_and(opencv,opencv, mask= mask)
cv2.imshow('blue',blue)
#=============指定绿色值的范围=============
minGreen = np.array([50,50,50])
maxGreen = np.array([70,255,255])
#确定绿色区域
mask = cv2.inRange(hsv, minGreen, maxGreen)
#通过掩码控制的按位与,锁定绿色区域
green = cv2.bitwise_and(opencv,opencv, mask= mask)
cv2.imshow('green',green)
#=============指定红色值的范围=============
minRed = np.array([0,50,50])
maxRed = np.array([30,255,255])
#确定红色区域
mask = cv2.inRange(hsv, minRed, maxRed)
#通过掩码控制的按位与,锁定红色区域
red= cv2.bitwise_and(opencv,opencv, mask= mask)
cv2.imshow('red',red)
cv2.waitKey()
cv2.destroyAllWindows()
效果如下:
可以看到,除红色提取有一点点杂质之外,其它两种颜色效果还是很好的,基本上可以将几种颜色区分提取出来。
按位与实现掩膜
在前面也有讲过按位与是如何操作的,这里就不再赘述。通过设计掩膜,进行按位与计算,保留感兴趣区域的信息,其他全部去掉。
实现代码
import cv2
import numpy as np
img=np.ones([5,5],dtype=np.uint8)*9
mask =np.zeros([5,5],dtype=np.uint8)
mask[0:3,0]=1
mask[2:5,2:4]=1
roi=cv2.bitwise_and(img,img, mask= mask)
print("img=\n",img)
print("mask=\n",mask)
print("roi=\n",roi)
效果如下:
与1相对应的位置的值都保留下来了,与0相对应的位置都赋值为0。
OpenCV中还存在一个BGRA的色彩空间,其使用方法和其他色彩空间转换相同都是调用cv2.cvtColor(img,cv.COLOR_BGR2BGRA)