小白菜的opencv学习(6)图像颜色过滤

现在我们来学习颜色过滤,学习颜色过滤之前,先了解一下HSV的概念。HSV和RGB一样是用来表示颜色的,我这里不多解释,放一张从维基百科找来的图片。在这里插入图片描述为什么颜色过滤用HSV而不用RGB呢?因为颜色过滤一般是过滤一种颜色,比如要过滤红色,肯定是大红、桃红、深红等一起过滤,而这些红色很难从RGB三通道中找到一个简单有效的规律,来实现颜色的过滤。而HSV则建立了像下面一样的立体,相似的颜色在一起,这样就可以定义两组HSV,来在立体中定义了一个小立体,通过判断颜色是否在立方体中来判断是否要过滤。
在这里插入图片描述好,接下来我们看一下如何实现颜色过滤:

import cv2
import numpy as np

img = cv2.imread('HSV.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

lower_red1 = np.array([160,50,0])
upper_red1 = np.array([179,255,255])
lower_red2 = np.array([0,50,0])
upper_red2 = np.array([10,255,255])
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = mask1 + mask2
res = cv2.bitwise_and(img,img, mask = mask)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('res',res)

cv2.waitKey(0)
cv2.destroyAllWindows()

这里面用到了从百度里找的一张很辣的图:
在这里插入图片描述处理之后得到下面两张图:
在这里插入图片描述可以看到,程序把原图的红色部分过滤了出来,下面来介绍一下今天用到的函数:
mask = cv2.inRange(hsv, lower_red, upper_red)
cv2.inRange()三个参数,第一个参数要处理的图片
后面两个参数是文章开头提到的两组HSV,
如果三个数在这两组数据之间,那么就设置为255,否则为0,就是右边那张黑白图了。
接下来再用就是用上节说的bitwise_and()函数覆盖了。
那么为什么要用这两组HSV呢?
红色的H在HSV图中是0度,所以我们设置为-20度到+20度,这个可以自行尝试。
从原图可以看到,我们要过滤的红色还是很“红”的,所以饱和度上限可以比较高一些。
因为光线原因,辣椒难免会有发暗的面,而图中很有看到其他暗红色,所以我这里直接设置0~255
那我为什么H要写成两组加起来呢?因为这里0~360度对应的是0~180,亮度饱和度的0~1对应的是0~255。再具体的原因可以点击这里
解决方法就是写两个lower-upper,一个170~179,一个0~10,然后经过inRange()之后再用之前学得add加起来就好。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值