Python-OpenCV颜色提取分割方法
简介
在进行图像处理时,颜色提取和分割是很常用的技术。本文将介绍如何使用Python以及OpenCV库进行颜色提取和分割。
基础知识
OpenCV
OpenCV是一个开源计算机视觉库,包括各种图像处理和计算机视觉的函数。在Python中,OpenCV库能够与Numpy库整合,并可实现使图像变得更加易于处理的数据格式和工具。
RGB颜色空间
RGB颜色空间使用红(R)、绿(G)、蓝(B)三种颜色分量来描述一种颜色。在RGB颜色空间中,每个颜色分量的取值范围为0-255。例如,灰色可用(128,128,128)或(0.5×255,0.5×255,0.5×255)来表示。
HSV颜色空间
HSV颜色空间使用色相(Hue)、饱和度(Saturation)、明度(Value)三个值来描述一种颜色。HSV颜色空间对于颜色提取很有用,因为它将颜色的亮度和彩度分离开来,且更加符合人眼的感知方式。在HSV颜色空间中,H的取值范围为0-180,S和V的取值范围均为0-255。
颜色提取
本文使用的图像是网上随机下载的一张彩色图片:
为了更好地提取图片中的红色部分,我们将颜色空间转换为HSV。在HSV颜色空间中,红色的H值大约为0或150,而S和V的值通常都比较高。我们可以使用inRange函数来筛选出H、S、V在一定范围内的像素:
import cv2
image = cv2.imread("image.jpg")
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义HSV值的范围
lower_red = np.array([0, 100, 100])
upper_red = np.array([10, 255, 255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)
lower_red = np.array([160, 100, 100])
upper_red = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_red, upper_red)
# 将两个mask合并
mask = mask1 + mask2
# 将mask带入图像中查看效果
res = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("res",res)
cv2.waitKey(0)
cv2.destroyAllWindows()
上述代码中,我们首先导入了OpenCV库,读取了一张图片并将其从BGR颜色空间转换为HSV颜色空间。接着,我们定义了两个数组,lower_red和upper_red,用于指定红色的取值范围。我们使用了inRange函数来获取H、S、V在特定范围内的像素,生成了两个不同阈值的掩膜(mask1和mask2)。最后,我们将两个掩膜合并成一个(mask = mask1 + mask2),使用bitwise_and函数将掩膜应用于原始图像。最终,我们可以得到包含红色部分的结果图像。
颜色分割
在颜色分割中,我们将对象从图像的背景中分离出来。在接下来的示例中,我们将使用一张包含红色和绿色球的图片,将两个球从背景中分离出来。
import cv2
import numpy as np
# 读取图片
image = cv2.imread("balls.jpg")
# 颜色空间转换BGR->HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 确定颜色的阈值范围
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
mask_red = cv2.inRange(hsv, lower_red, upper_red)
# 确定绿色的阈值范围
lower_green = np.array([50, 50, 50])
upper_green = np.array([100, 255, 255])
mask_green = cv2.inRange(hsv, lower_green, upper_green)
# 将两个mask合并
mask = mask_red + mask_green
# 对图像应用掩膜
res = cv2.bitwise_and(image,image,mask=mask)
# 显示结果
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个示例中,我们首先导入了OpenCV和Numpy库,并读取了一张包含两个球的图片。然后,我们通过转换为HSV颜色空间并使用inRange函数定义两个颜色的阈值范围,来获取两个掩膜(mask_red和mask_green)。最终,我们将两个掩膜合并成一个(mask = mask_red + mask_green)并将其应用于原始图像,获得包含红色和绿色球的结果图像。
总结
本文介绍了如何使用Python和OpenCV库进行颜色提取和分割。在进行颜色提取时,我们可以利用opencv库的inRange函数来获取像素的范围,拼凑成掩膜,从而提取指定颜色的像素。在分割时,可以类似地使用两个掩膜来从复杂的背景中分离出指定颜色的物体。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python-opencv颜色提取分割方法 - Python技术站