3.python-opencv图像mask掩膜处理

第一章 python-opencv-图片导入和显示
第二章 python-opencv图像简单处理


`


前言

本文主要实现只提取图像中的‘花’所在的区域,其他背景区域全部转为黑色。可以使用mask对图像进行掩膜处理,从而提取‘花’部分的ROI,本文主要涉及颜色空间转换、mask设置和按位运算。


一、颜色空间转换

我们主要用到的色彩空间包括: Gray色彩空间,RGB策菜空间和HSV色彩空间。
Gray色彩空间:Gray通常指8位灰度图,像素取值范围[0-255]
RGB色彩空间:RGB颜色可以表示为(Red, Green, Blue)。其中,各个分量的数值越小,亮度越低。数值越大,亮度越高;如:(0,0,0)表示黑色,(255,255,255)表示白色
HSV色彩空间:HSV色彩空间包括Hue色调、Saturation饱和度、Value亮度。opencv中把色调的取值范围映射到[0,180],数值和颜色的的对应为:0-红色、30-黄色、60-绿色、90-青色、120-蓝色、150-品红色。.opencv中把饱和度的取值范围映射到[0,255],数值越大饱和度越高。opencv中把亮的取值范围映射到[0,255],0表示黑色,255表示白色。

色彩空间转换函数如下,其中src为需要转换的图片,code表示转换方法,
cv2.COLOR_BGR2GRAY:表示从BGR转换位灰度图像。
cv2.COLOR_BGR2HSV:表示从BGR转换位HSV。

cvtColor(src, code, dst=None, dstCn=None)

在python-opencv中的使用方法

cv2.cvtColor(picture, code = cv2.COLOR_BGR2HSV)

二、mask设置

根据蓝色的范围标记图片中的蓝色区域的ROI,使用inRange函数,inRange 表示是否在lower_blue-upper_blue范围内,在则为255,不在则为0,其中src为需要转换的图片,lowerb, upperb分别表示颜色范围上下限。

inRange(src, lowerb, upperb, dst=None)

在python-opencv中的使用方法

mask = cv2.inRange(picture, lower_blue, upper_blue)

经过mask的设置后,图像只存在0和255像素值,即只有黑白,白色区域即为要找的ROI,黑色区域为背景区域。

三、按位运算

图像的与运算主要用于获取某个图像中感兴趣的部分,是针对两个图像矩阵数组或一个数组与标量的按位与,按位与运算的函数如下,其中每个参数表示为:
src1、src2:为输入图像或标量,标量可以为单个数值或一个四元组
dst:可选输出变量,如果需要使用非None则要先定义,且其大小与输入变量相同
mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0。

bitwise_and(src1, src2, dst=None, mask=None)

按位与运算在opencv中的用法

cv2.bitwise_and(picture1, picture2, mask=mask)

总结

本文主要讲了mask掩膜处理,首先将图像有RGB转化为HSV颜色空间,然后根据像素值确定ROI区域,最后根据按位与运算将ROI区域提取。完整代码如下:

import cv2
import numpy as np

if __name__ == '__main__':
	#加载图片
    img1 = cv2.imread('./rose.png')
    #颜色空间转换
    img2 = cv2.cvtColor(img1, code = cv2.COLOR_BGR2HSV)  #颜色空间的转变
    #在HSV里面设置blue的上下限
    lower_blue = np.array([110, 50, 50])  #浅蓝色
    upper_blue = np.array([130, 255, 255])  #深蓝色
    #根据蓝色的范围标记图片中那些是蓝色
    #inRange 表示是否在lower_blue-upper_blue范围内,在则为255,不在则为0
    mask = cv2.inRange(img2, lower_blue, upper_blue)
    #按位与运算
    res = cv2.bitwise_and(img1, img1, mask=mask)
    #显示原图
    cv2.imshow('orange',img1)
	#显示变换后的图片
    cv2.imshow('hsv', res)
    #关闭窗口
    cv2.waitKey(0)
    #销毁内存
    cv2.destroyAllWindows()

运行结果
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐