OpenCV系列 | 颜色分离(cv2.inRange与cv2.bitwise_and)

对于一张彩色图像,若有需要对某种颜色进行分离出来,在 OpenCV 中需要使用到 cv2.inRange 和 cv2.bitwise_and 两个函数。

首先介绍一下两个函数:

1、cv2.inRange

  • cv2.inRange(src, lowerb, upperb)
  • 用以确认元素值是否介于某个区域
  • inRange 函数需要设定三个参数,其中 src 指源图像;lowerb 指图像中低于 lowerb 的值,其所对应的图像值将为 0;upperb指图像中高于 upperb 的值,图像值变为 0 。换言之,源图像中仅有图像值介于 lowerb 和 upperb 之间的值才不为 0 ,且值将变成 255

2、cv2.bitwise_and

  • cv2.bitwise_and(src1, scr2, mask=)
  • 用于对两个数组(图像也是数组)对位元素进行运算,即计算机中的“和”运算。以二进制为例,1&0输出 1 ,1&0、0&1、0&0则均输出 0 。
  • bitwise_and 函数需要设定三个参数,其中 src1 指第一个数组(源图像),src2 指第二个数组(源图像),mask= 用于指定具体的掩模(常以 0 和 1 元素为主,用以输出具体的元素),应设为 uint8 格式,即单通道的 8-bit 的数组。另外,mask 参数为可选参数,可省略。

言归正传,以某张船的照片为例,分离出图像的蓝色。

# 导入模块,输出原图
import cv2
import matplotlib.pyplot as plt
ship_rgb = cv2.imread('ship.jpg')[:,:,::-1]
plt.imshow(ship_rgb)
plt.show()

输出:

在这里插入图片描述

# 将图像转为HSV格式进而得到mask,HSV分别代表色相(Hue)、饱和度(Saturation)、明度(Value)
ship_hsv = cv2.cvtColor(ship_rgb, cv2.COLOR_RGB2HSV)
# 设定参数lowerb、upperb
import numpy as np
lowerb = np.array([100,100,100])
upperb = np.array([140,255,255])
# 获取mask
mask = cv2.inRange(ship_hsv, lowerb, upperb)
# 利用mask进行颜色分离
ship_masked = cv2.bitwise_and(ship_bgr,ship_bgr,mask=mask)
# 转回RGB格式
ship_blue = cv2.cvtColor(ship_masked,cv2.COLOR_BGR2RGB)

为更直观看出其变化过程,画出图像变化过程及使用的中间量:

image_list = [ship_rgb,ship_hsv,mask,ship_masked,ship_blue]
title_list = ['ship_rgb','ship_hsv','mask','ship_masked','ship_blue']
plt.figure(figsize=(40,8))
for i in range(len(title_list)):
    plt.subplot(1,5,i+1)
    plt.imshow(image_list[i])
    plt.axis('off')
    plt.title(title_list[i],size=50)
plt.tight_layout()
plt.show()

输出:

在这里插入图片描述

  • 16
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值