第一章 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)
根据蓝色的范围标记图片中的蓝色区域的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()