一、图像分割
- 图像分割是将图像分成若干具有独特性质的区域并提取感兴趣目标的技术和过程,它是图像处理和图像分析的关键步骤。
- 主要分为基于阈值的分割方法、
- 基于区域的分割方法、
- 基于边缘的分割方法
- 和基于特定理论的分割方法。
二、颜色分割
1、定义
- 颜色分割是图像处理中的一种重要技术,它可以将图像中的不同颜色分割出来,用于目标检测、图像识别等应用场景。
2、原理
- 颜色分割的算法原理比较简单,它通常基于颜色空间的变换来实现。常用的颜色空间有RGB、HSV、LAB等,其中HSV颜色空间比较适合颜色分割任务。
HSV颜色空间将颜色分成三个通道:色调(Hue)、饱和度(Saturation)和亮度(Value)。- 色调:表示颜色的种类或类型,例如红色、蓝色、绿色等。
- 饱和度:表示颜色的纯度,越饱和的颜色越鲜艳,反之亦然。
- 亮度:指颜色的明暗程度。在颜色中,亮度越高,颜色就越明亮;亮度越低,颜色就越暗淡。
3、基本思路
- 颜色分割的基本思路是通过阈值来分割不同颜色的像素。
具体地,我们可以将图像从RGB颜色空间转换到HSV颜色空间,然后选择合适的阈值(通常是色调、饱和度、亮度的最大值最小值),将图像分成黑白两部分。
4、取值范围
在opencv hsv颜色空间中
- 色调(Hue)的最大值是179度,最小值是0度,代表了颜色在色轮上的位置。
- 饱和度(Saturation)的最大值是255,最小值是0,代表了颜色的纯度和灰度。
- 亮度(Brightness)的最大值是255,最小值是0,代表了颜色的明暗程度。
5、实现步骤
- 基于上述算法原理,我们可以进行如下步骤来实现颜色分割:
- 1、将图像从RGB颜色空间转换到HSV颜色空间。
- 2、分别计算色调、饱和度、亮度的最大值和最小值
- 3、设置阈值,将图像分割成黑白两部分。
- 4、使用形态学操作去除噪点,得到最终的分割结果。
三、inRange()函数
mask = cv2.inRange(src, lowerb, upperb[, dst])
- src 参数是输入图像,可以是单通道或多通道的,数据类型为 np.uint8
- mask是输出图像,为单通道图像(二值图像),数据类型和输入图像相同
- lowerb 是指定的下限,类型为 Scalar,可以是单个值或者一个包含多个值的元组或列表
- upperb 是指定的上限,类型为 Scalar,可以是单个值或者一个包含多个值的元组或列表
注:mask代表了与指定颜色范围匹配的像素点的位置信息,即在指定颜色范围内的像素点在二值图像中对应的像素值为255,不在指定颜色范围内的像素点在二值图像中对应的像素值为0。因此,通过使用这个掩膜,我们可以选择性地对图像进行操作,只对指定颜色范围内的像素点进行处理,而不影响其他像素点.
四、常见颜色的HSV大致范围:
- 红色:(0, 70, 50) - (10, 255, 255) 或者 (156, 70, 50) - (179, 255, 255)
- 橙色:(10, 70, 50) - (25, 255, 255)
- 黄色:(25, 70, 50) - (35, 255, 255)
- 绿色:(35, 70, 50) - (85, 255, 255)
- 青色:(85, 70, 50) - (100, 255, 255)
- 蓝色:(100, 70, 50) - (130, 255, 255)
- 紫色:(130, 70, 50) - (170, 255, 255)
- 黑色: (0, 0, 0) - (180, 255, 46)
- 白色:(0, 0, 221) - (180, 30, 255)
- 灰色:(0,0,46) - (180,43,220)
五、程序
import cv2
import numpy as np
# 读入图片
img = cv2.imread( "d:\\OpenCVpic\\happyfish.jpg")
cv2.imshow('img', img)
# 转换颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 定义绿色范围
lower_green = np.array([40, 50, 50])
upper_green = np.array([90, 255, 255])
# 定义黄色范围
lower_yellow = np.array([15, 50, 50])
upper_yellow = np.array([40, 255, 255])
# 根据颜色范围创建掩码
mask_green = cv2.inRange(hsv, lower_green, upper_green)
mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)
# 合并掩码
mask = cv2.bitwise_or(mask_green, mask_yellow)
# 应用掩码
result = cv2.bitwise_and(img, img, mask=mask)
# 显示结果
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
![](https://img.haomeiwen.com/i17748967/d16b407625d0658d.png)
六、资料
「黑夜寻白天」的博客:
https://blog.csdn.net/weixin_44598554/article/details/130627957
网友评论