1、背景
现阶段工作内容需要,本人需要对一些数据进行处理,去除图像上被绘制的文字与特定颜色的线条,在此对其进行记录,以便后续回顾(小白总结)。
2、知识点
重要的事提前说:
rgb色彩空间虽然是被广泛接受的色彩空间,但我们不能够直接通过其值感知具体的色彩。hsv色彩空间提供了这样的方式,在此处我们使用hsv通道对颜色进行筛选,如果一定想使用rgb,可以逐个像素点遍历,但不建议这么做!
将图片转换为hsv通道的图像
img = cv2.cvtColor(image, code=cv2.COLOR_BGR2HSV)
利用函数将颜色阈值内的像素变为255,其余为0
mask = cv2.inRange(img, lower, upper)
利用cv2.dilate()函数对图片进行膨胀处处理,避免去除区域不完整
kernel = np.ones((3, 3), np.uint8)
dilate1 = cv2.dilate(mask, kernel, iterations=2)
选取掩膜区域(要筛选的颜色区域)
cv2.bitwise_and(frame, frame, mask=dilate1)
自动根据给定的掩膜(mask)来修复图像,即用图像中的其他部分来填充掩膜部分的像素
dst_TELEA1 = cv2.inpaint(image, dilate1, 2, cv2.INPAINT_TELEA)
3、实践
以下是本人使用到的(单一)颜色阈值范围:
颜色 | h | h | s | s | v | v |
---|---|---|---|---|---|---|
红色 | 0 | 11 | 125 | 225 | 120 | 255 |
绿色 | 41 | 93 | 150 | 255 | 123 | 255 |
蓝色 | 90 | 110 | 200 | 255 | 220 | 255 |
紫色 | 135 | 160 | 82 | 255 | 145 | 180 |
如果需要对全部颜色识别可查看完整hsv阈值表
以绿色为例:
# 颜色空间转换
img2 = cv2.cvtColor(image, code=cv2.COLOR_BGR2HSV)
# 在HSV里面设置上下限
lower_green = np.array([41, 150, 123])
upper_green = np.array([93, 255, 255])
kernel = np.ones((3, 3), np.uint8)
# inRange 表示是否在范围内,在则为255,不在则为0
mask = cv2.inRange(img2, lower_green, upper_green)
dilate1 = cv2.dilate(mask, kernel, iterations=2)
# 按位与运算
cv2.bitwise_and(frame, frame, mask=dilate1)
# 去除mask区域
dst_TELEA1 = cv2.inpaint(frame, dilate1, 2, cv2.INPAINT_TELEA)
4、制作hsv查看工具
思路:鼠标取点获取颜色-->转换为hsv值,大家已经总结的很好了,在此推荐以下,我看到的:
获得单一点的rgb和hsv值可参考:基于python鼠标点击获取当前像素的RGB和HSV对应值-CSDN博客
获取图像的某个颜色的hsv值区域。可参考:
opencv-hsv_tools: 一个基于Qt实现的Opencv HSV阈值编辑器
以上为去除线段的全部内容,感谢您耐心看到这里,手动鞠躬~