如何定义阈值以仅检测图像中的绿色对象:Opencv

S.A*_*.Am 8 python opencv image-processing threshold

我只是想从自然环境中捕获的图像中仅检测绿色物体.如何定义它?因为在这里我要通过阈值让我们说'x',通过使用这个x我想只获得一种颜色的绿色对象(白色)其他必须出现在另一种颜色(黑色)请指导我做这个.提前致谢.

Kin*_*t 金 25

更新:

我做了一个HSV色彩图.这是more easy and accurate使用这张地图找到颜色范围比以前.

也许我应该改变用途(40, 40,40) ~ (70, 255,255) in hsv来找到green.

在此输入图像描述


原始答案:

  1. 转换为HSV色彩空间,
  2. 使用cv2.inRange(hsv, hsv_lower, hsv_higher)中获取绿色面具.

我们使用the range (in hsv):(36,0,0) ~ (86,255,255)为此sunflower.


源图片:

在此输入图像描述

蒙面绿色区域:

在此输入图像描述

更多步骤:

在此输入图像描述


核心源代码:

import cv2
import numpy as np

## Read
img = cv2.imread("sunflower.jpg")

## convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

## mask of green (36,25,25) ~ (86, 255,255)
# mask = cv2.inRange(hsv, (36, 25, 25), (86, 255,255))
mask = cv2.inRange(hsv, (36, 25, 25), (70, 255,255))

## slice the green
imask = mask>0
green = np.zeros_like(img, np.uint8)
green[imask] = img[imask]

## save 
cv2.imwrite("green.png", green)
Run Code Online (Sandbox Code Playgroud)

类似:

  1. 使用`cv :: inRange`(OpenCV)为颜色检测选择正确的上下HSV边界

  • 就我而言,我使用 `[36 0 0]` ~ `[ 86 255 255]` (2认同)

Jer*_*uke 10

介绍:

使用LAB 色彩空间可以非常轻松地应用阈值来检测绿色。

LAB 颜色空间也有 3 个通道,但与 RGB 对应项(所有 3 个都是颜色通道)不同,LAB 中有2 个颜色通道1 个亮度通道

  • L通道:代表图像中的亮度值
  • A通道:代表图像中的红色和绿色
  • B通道:代表图像中的蓝色和黄色

观察下图:

在此输入图像描述

绿色和红色代表 A 通道的末端。在此通道上应用合适的阈值可以分割绿色或红色。

演示:

以下图片按顺序排列:

1.原始图像 -->> 2. LAB 转换图像的 A 通道

3.阈值-->> 4.原始图像上的掩模

样本1:

在此输入图像描述 在此输入图像描述

在此输入图像描述 在此输入图像描述

样本2:

在此输入图像描述 在此输入图像描述

在此输入图像描述 在此输入图像描述

样本3:

在此输入图像描述 在此输入图像描述

在此输入图像描述 在此输入图像描述

代码:

代码只有几行:

# read image in BGR
img = cv2.imread('image_path')
# convert to LAB space
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
# store the a-channel
a_channel = lab[:,:,1]
# Automate threshold using Otsu method
th = cv2.threshold(a_channel,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)[1]
# Mask the result with the original image
masked = cv2.bitwise_and(img, img, mask = th)
Run Code Online (Sandbox Code Playgroud)

例外:

如果绿色明显出现,上述方法就完美。但应用自动阈值可能并不总是有效,特别是当同一图像中存在不同深浅的绿色时。

在这种情况下,可以在 A 通道上手动设置阈值。

img = cv2.imread('flower.jpg')
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
a_channel = lab[:,:,1]
# manually set threshold value
th = cv2.threshold(a_channel, 105, 255, cv2.THRESH_BINARY_INV)
# perform masking
masked = cv2.bitwise_and(img, img, mask = th)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在此输入图像描述

    Threshold image                              Masked image
Run Code Online (Sandbox Code Playgroud)


nat*_*ncy 5

您可以使用简单的 HSV 颜色阈值脚本来使用磁盘上任何图像的轨迹栏来确定下/上颜色范围。只需更改 中的图像路径即可cv2.imread()。隔离绿色的示例:

import cv2
import numpy as np

def nothing(x):
    pass

# Load image
image = cv2.imread('1.jpg')

# Create a window
cv2.namedWindow('image')

# Create trackbars for color change
# Hue is from 0-179 for Opencv
cv2.createTrackbar('HMin', 'image', 0, 179, nothing)
cv2.createTrackbar('SMin', 'image', 0, 255, nothing)
cv2.createTrackbar('VMin', 'image', 0, 255, nothing)
cv2.createTrackbar('HMax', 'image', 0, 179, nothing)
cv2.createTrackbar('SMax', 'image', 0, 255, nothing)
cv2.createTrackbar('VMax', 'image', 0, 255, nothing)

# Set default value for Max HSV trackbars
cv2.setTrackbarPos('HMax', 'image', 179)
cv2.setTrackbarPos('SMax', 'image', 255)
cv2.setTrackbarPos('VMax', 'image', 255)

# Initialize HSV min/max values
hMin = sMin = vMin = hMax = sMax = vMax = 0
phMin = psMin = pvMin = phMax = psMax = pvMax = 0

while(1):
    # Get current positions of all trackbars
    hMin = cv2.getTrackbarPos('HMin', 'image')
    sMin = cv2.getTrackbarPos('SMin', 'image')
    vMin = cv2.getTrackbarPos('VMin', 'image')
    hMax = cv2.getTrackbarPos('HMax', 'image')
    sMax = cv2.getTrackbarPos('SMax', 'image')
    vMax = cv2.getTrackbarPos('VMax', 'image')

    # Set minimum and maximum HSV values to display
    lower = np.array([hMin, sMin, vMin])
    upper = np.array([hMax, sMax, vMax])

    # Convert to HSV format and color threshold
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower, upper)
    result = cv2.bitwise_and(image, image, mask=mask)

    # Print if there is a change in HSV value
    if((phMin != hMin) | (psMin != sMin) | (pvMin != vMin) | (phMax != hMax) | (psMax != sMax) | (pvMax != vMax) ):
        print("(hMin = %d , sMin = %d, vMin = %d), (hMax = %d , sMax = %d, vMax = %d)" % (hMin , sMin , vMin, hMax, sMax , vMax))
        phMin = hMin
        psMin = sMin
        pvMin = vMin
        phMax = hMax
        psMax = sMax
        pvMax = vMax

    # Display result image
    cv2.imshow('image', result)
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

HSV 下/上颜色阈值范围

(hMin = 52 , sMin = 0, vMin = 55), (hMax = 104 , sMax = 255, vMax = 255)
Run Code Online (Sandbox Code Playgroud)

一旦确定了您的颜色范围lowerupperHSV 颜色范围,您就可以像这样分割您想要的颜色:

import numpy as np
import cv2

image = cv2.imread('1.png')
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([52, 0, 55])
upper = np.array([104, 255, 255])
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(image, image, mask=mask)

cv2.imshow('result', result)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)