颜色识别实验,主要是通过掩膜对原图进行与运算来识别我们要找的颜色,因此我们需要了解如何寻找目标颜色,掩膜是什么以及与运算的概念。
一、寻找目标颜色
1.RGB颜色空间
1.1定义
在图像处理中,最常见的就是RGB颜色空间。RGB颜色空间是我们接触最多的颜色空间,RGB代表红色(Red)、绿色(Green)和蓝色(Blue),这三种颜色通过不同强度的光的组合来创建其他颜色。
RGB颜色模型基于笛卡尔坐标系, 黑色位于原点处,白色位于离原点最远的角上。因为黑色在RGB三通道中表现为(0,0,0),所以映射到这里就是原点;而白色是(255,255,255),所以映射到这里就是三个坐标为最大值的点。三原色红绿蓝分别为(255,0,0),(0,255,0),(0,0,255)位于三个角。
注意:在OpenCV中,颜色是以BGR的方式进行存储的,而不是RGB,这也是上面红色的像素值是(0,0,255)而不是(255,0,0)的原因。
1.2颜色加法
简单的图像加法:两个图像应该具有相同的大小和类型。
1.2.1原理
opencv的加法cv2.add 与numpy的加法 + 是存在差异的:
opencv结果超过255,就取255
def add_color():
img1 = np.array([[10,20,30],
[255,248,250]],dtype=np.uint8)
img2 = np.array([[100,80,90],
[299,200,300]],dtype=np.uint8)
img3 = cv2.add(img1,img2)
print(img3)
if __name__ == '__main__':
add_color()
结果:
[[110 100 120]
[255 255 255]]
numpy结果超过255,将结果与256取余
def add_color():
img1 = np.array([[10,20,30],
[255,248,250]],dtype=np.uint8)
img2 = np.array([[100,80,90],
[299,200,300]],dtype=np.uint8)
# img3 = cv2.add(img1,img2)
img3 = img1 + img2
print(img3)
if __name__ == '__main__':
add_color()
结果:
[[110 100 120]
[ 42 192 38]]
1.2.2图像案例
import cv2
import numpy as np
img1 = cv2.imread('./src/pig.png')
img2 = cv2.imread('./src/cao.png')
img3 = cv2.add(img1,img2)
cv2.imshow('img3',img3)
cv2.waitKey(0)
结果:
OpenCV的cv2.add,结果超过256,会把结果强行改为256。
import cv2
import numpy as np
img1 = cv2.imread('./src/pig.png')
img2 = cv2.imread('./src/cao.png')
img3 = img1+img2
cv2.imshow('img3',img3)
cv2.waitKey(0)
结果:
numpy加法,结果超过256,结果与256进行取余运算。
1.3颜色加权加法
需要自己设置图像权重,方法为cv2.addWeighted(img1,权重数,Img2,权重数,亮度数值)
import cv2
import numpy as np
img1 = cv2.imread('./src/pig.png')
img2 = cv2.imread('./src/cao.png')
img3 = cv2.addWeighted(img1,0.4,img2,0.6,2)
cv2.imshow('img3',img3)
cv2.waitKey(0)
结果:
2.HSV颜色空间
2.1定义
HSV颜色空间指的是HSV颜色模型,这是一种与RGB颜色模型并列的颜色空间表示法。
HSV颜色空间使用色调(Hue)、饱和度(Saturation)和亮度(Value)三个参数来表示颜色,色调H表示颜色的种类,如红色、绿色、蓝色等;饱和度表示颜色的纯度或强度,如红色越纯,饱和度就越高;亮度表示颜色的明暗程度,如黑色比白色亮度低。
2.2颜色划分
2.3识别目标颜色
2.3.1转换颜色空间:
import cv2
import numpy as np
img =cv2.imread('./photo/12.jpg')
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow('img',img)
cv2.imshow('img_hsv',img_hsv)
cv2.waitKey(0)
结果:
2.3.2查找颜色
比如:查找蓝色,仅仅保留蓝色部分
import cv2
import numpy as np
img =cv2.imread('./photo/12.jpg')
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
color_low = np.array([100,43,46])
color_upper = np.array([124,255,255])
img_hsv = cv2.inRange(img_hsv,color_low,color_upper)
cv2.imshow('img',img)
cv2.imshow('img_hsv',img_hsv)
cv2.waitKey(0)
结果:
二、掩膜
1.定义
掩膜通常是一个二值化图像,并且与原图像的大小相同,其中目标区域被设置为1(或白色),而其他区域被设置为0(或黑色),并且目标区域可以根据HSV的颜色范围进行修改。
上一个hsv查找颜色部分,就相当于掩膜。
2.制作掩膜
(1)读图 cv2.imread(path);
(2)转换颜色空间到hsv空间 cv2.cvtColor(img,cv2.COLOR_BGR2HSV);
(3)设置color_low和color_upper,设置的这个numpy数组是你要查找的颜色的最低值和最高值;
(4)创作掩膜 cv2.inRange(img2,color_low,color_upper);
(5)显示图像。
三、与运算
1.定义
将两个图像中所有的对应像素值一一进行“与”运算,从而得到新的图像。
0 and (图像1像素&图像2对应像素)
x and y:结果只能是x 或者 y,不能是True或者False;
&:按位与,像素值要一一对齐,相同为1,不同为0。
2.抠图
制作的掩膜只有这个颜色的区域,但是也没有显示出它本身的颜色,为了让它显示出这个颜色,我们还需要进行与运算。
3.完整步骤:
(1)读图 cv2.imread(path);
(2)转换颜色空间到hsv空间 cv2.cvtColor(img,cv2.COLOR_BGR2HSV);
(3)设置color_low和color_upper,设置的这个numpy数组是你要查找的颜色的最低值和最高值;
(4)创作掩膜 cv2.inRange(img2,color_low,color_upper);
(5)与运算 cv2.bitwise_and(img2,img2,mask=img_mask)
(6)显示图像。
import cv2
import numpy as np
#读图
img = cv2.imread('./photo/12.jpg')
#转换颜色空间
img_hsv =cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#找到目标颜色的取值
lower = np.array([156,43,46])
upper = np.array([180,255,255])
#制作掩膜
img_mask = cv2.inRange(img_hsv,lower,upper)
#抠图
photo = cv2.bitwise_and(img,img,mask = img_mask)
#显示图像
cv2.imshow('img',img)
cv2.imshow('img_mask',img_mask)
cv2.imshow('photo',photo)
cv2.waitKey(0)
结果: