将图像中的所有彩色像素设置为Bright [255] ?, OpenCV

时间:2019-10-02 16:36:53

标签: python-3.x opencv

我正在做一个项目,其中涉及校园周围标志的彩色图片。我需要抓住标牌并在标牌上标记数字。

enter image description here

到目前为止,我一直在拍摄图像,将其转换为灰度,对其进行过滤/锐化。然后阈值抓住标志。在大多数情况下,这是可行的,因为符号为黑色,文本为白色。

enter image description here

但是,有些图像中有暗阴影,加上明亮的阳光,使阴影中的某些背景部分比黑色符号暗。

enter image description here

因此,没有阈值保持值可以将符号与背景隔离。

所以我的问题是,有没有一种方法可以对图像进行预处理,以便将所有彩色部分,甚至是真正的深色部分(例如深棕色/红色)都设置为255。然后根据阈值将其全部设置为黑色部分设置为0,白色部分设置为255。

我知道白色,黑色和灰色的bgr值都差不多,因此肯定应该有一种方法。

非常抱歉,我无法直接链接图像,我的积分不足。

2 个答案:

答案 0 :(得分:1)

您可以将图像转换为HSV-色相,饱和度,值。色相定义颜色,饱和度定义颜色的强度,并定义亮度。黑色/灰色/白色值的饱和度很小,因此您可以使用该属性删除背景。

这是HSV可视化效果:
enter image description here 您希望所有值都在圆柱体的“核心”中。

结果:
enter image description here

代码:

    import cv2
    import numpy as np
    # load image
    img = cv2.imread("0hfSa20.png")
    # Convert to HSV
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # define range wanted color in HSV
    lower_val = np.array([0,0,0]) #full black RGB = 0,0,0
    upper_val = np.array([179,58,255]) # all hue, all value, cap saturation at 58

    # Threshold the HSV image to get only grayish colors
    mask = cv2.inRange(hsv, lower_val, upper_val)

    # apply mask to image
    res = cv2.bitwise_and(img,img,mask=mask)

    # display image
    cv2.imshow("Res", res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

HSV也非常适合过滤颜色。如果您想尝试价值观并学习理解HSV,this script会很有帮助。

答案 1 :(得分:0)

我喜欢@ J.D.s Answer。非常聪明。

作为一种替代解决方案,自适应高斯阈值对我有效(常规自适应阈值也是如此)。但是出现了意外的变化:我使用了常量C

import cv2

image = cv2.imread('311.png', 0)
image = cv2.adaptiveThreshold(image,255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                              cv2.THRESH_BINARY, 17, -6)
cv2.imwrite('311_thresh.png', image)

image = cv2.imread('109.png', 0)
image = cv2.adaptiveThreshold(image,255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                              cv2.THRESH_BINARY, 17, -6)
cv2.imwrite('109_thresh.png', image)

311_thresh.png:

enter image description here

109_thresh.png:

enter image description here