OpenCV图片颜色识别

        颜色识别实验,主要是通过掩膜对原图进行与运算来识别我们要找的颜色,因此我们需要了解如何寻找目标颜色,掩膜是什么以及与运算的概念。

一、寻找目标颜色

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)

结果:

您好!对于OpenCV颜色识别,可以通过以下步骤来识别红、绿、蓝颜色: 1. 导入OpenCV库和其他必要的库: ```python import cv2 import numpy as np ``` 2. 读取图像并转换为HSV颜色空间: ```python image = cv2.imread("image.jpg") hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) ``` 3. 定义红、绿、蓝的HSV颜色范围: ```python red_lower = np.array([0, 100, 100]) red_upper = np.array([10, 255, 255]) green_lower = np.array([40, 100, 100]) green_upper = np.array([80, 255, 255]) blue_lower = np.array([90, 100, 100]) blue_upper = np.array([130, 255, 255]) ``` 4. 根据颜色范围创建掩膜: ```python red_mask = cv2.inRange(hsv_image, red_lower, red_upper) green_mask = cv2.inRange(hsv_image, green_lower, green_upper) blue_mask = cv2.inRange(hsv_image, blue_lower, blue_upper) ``` 5. 对掩膜进行形态学处理(可选): ```python kernel = np.ones((5, 5), np.uint8) red_mask = cv2.morphologyEx(red_mask, cv2.MORPH_OPEN, kernel) green_mask = cv2.morphologyEx(green_mask, cv2.MORPH_OPEN, kernel) blue_mask = cv2.morphologyEx(blue_mask, cv2.MORPH_OPEN, kernel) ``` 6. 找到颜色区域并绘制边界: ```python red_contours, _ = cv2.findContours(red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(image, red_contours, -1, (0, 0, 255), 2) green_contours, _ = cv2.findContours(green_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(image, green_contours, -1, (0, 255, 0), 2) blue_contours, _ = cv2.findContours(blue_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(image, blue_contours, -1, (255, 0, 0), 2) ``` 7. 显示结果图像: ```python cv2.imshow("Color Detection", image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,这只是一种简单的颜色识别方法,实际应用中可能需要根据具体情况进行调整和优化。希望对您有所帮助!如果您有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值