Bootstrap

OpenCV入门——色彩空间转换(2)

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)

 

 

 

 

 

;