如何从图像中检测黑色和灰色

use*_*126 6 python opencv colors image-processing image-segmentation

我正在尝试使用一个程序来检测黑色的任何色调(和一些轻微的灰色),但目前我在尝试找到一个好的上色调向量(upper_hue 变量)时遇到了困难,该向量可以让我在不提取的情况下提取大部分黑色色调其他颜色。它似乎适用于黑色鞋子或雨伞等图片,但在处理亮度变化的道路照片时会出现问题。

我试图找到一个好的上限色调范围,使程序能够对此保持稳健,但是它有可能获得非黑色。

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

什么是黑色和灰色值的好的上色相向量。如果这不是问题,那么解决这个问题的好方法是什么?

代码:

import cv2
import numpy as np
import imutils

def color_seg(choice):
    if choice == 'blue':
        lower_hue = np.array([100,30,30])
        upper_hue = np.array([150,148,255])
    elif choice == 'white':
        lower_hue = np.array([0,0,0])
        upper_hue = np.array([0,0,255])
    elif choice == 'black':
        lower_hue = np.array([0,0,0])
        upper_hue = np.array([50,50,100])
    return lower_hue, upper_hue


# Take each frame
frame = cv2.imread('images/black0.jpg')
#frame = cv2.imread('images/road_1.jpg')

frame = imutils.resize(frame, height = 300)
chosen_color = 'black'


# Convert BGR to HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

# define range of a color in HSV
lower_hue, upper_hue = color_seg(chosen_color)


# Threshold the HSV image to get only blue colors
mask = cv2.inRange(hsv, lower_hue, upper_hue)


cv2.imshow('frame',frame)
cv2.imshow('mask',mask)

cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

小智 5

在 hsv 颜色空间中,它非常简单。

img = cv2.imread(img_path)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_gray = np.array([0, 5, 50], np.uint8)
upper_gray = np.array([179, 50, 255], np.uint8)
mask_gray = cv2.inRange(hsv, lower_gray, upper_gray)
img_res = cv2.bitwise_and(img, img, mask = mask_gray)
Run Code Online (Sandbox Code Playgroud)

H 是色调,因此灰度检测器需要所有 H 值(0 -> 360°,由 OpenCV 表示的整数范围 0 到 179 以适合 8 位)。S 是饱和度 (0 -> 255)。灰度在 0 到 50 之间。如果我们不想保留白色值,我们可以取 5 作为最小值。V 是亮度值(0=暗 -> 255=亮)。