如何使用Python OpenCV定义一个阈值来仅检测图像中的绿色物体?

iswrvxsc  于 2023-10-24  发布在  Python
关注(0)|答案(3)|浏览(150)

我想从自然环境中拍摄的图像中只检测绿色物体。如何定义?
因为在这里我想通过阈值,让我们说“x”。通过使用这个x,我想让只有绿色颜色的对象变成一种颜色(白色),其他的必须出现在另一种颜色(黑色)。
我该怎么做?

xurqigkl

xurqigkl1#

单向
我做了一个HSV颜色Map表。使用这个Map表比以前更容易和准确地找到颜色范围。
也许我应该在HSV* 中改变使用 *(40,40,40)~(70,255,255)来找到 * 绿色 *。

另一种方式

1.转换到HSV颜色空间,
1.使用cv2.inRange(hsv, hsv_lower, hsv_higher)获取绿色蒙版。
我们使用 * 的范围(在HSV)(36,0,0)~(86,255,255)* 为这个 * 向日葵 *。
源图像:

掩蔽的绿色区域:

更多步骤:

核心源代码:

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)

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

iyfjxgzm

iyfjxgzm2#

简介:

应用阈值来检测绿色颜色可以使用LAB color space非常容易地执行。
LAB颜色空间也有3个通道,但与RGB对应通道(其中所有3个都是颜色通道)不同,LAB中有2个颜色通道1个亮度通道

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

观察下图:

绿色和红色在A通道的极端上表示。在该通道的这些极端中的任一个上应用合适的阈值可以分割绿色或红色。

Demo:

以下图像按顺序排列:

**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)

异常:

如果绿色颜色明显,上述方法将完美工作。但是应用自动阈值可能并不总是有效,特别是当同一图像中存在各种绿色阴影时。
在这种情况下,在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)

Threshold image                              Masked image
fykwrbwg

fykwrbwg3#

您可以使用一个简单的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()

HSV颜色阈值下限/上限范围

(hMin = 52 , sMin = 0, vMin = 55), (hMax = 104 , sMax = 255, vMax = 255)

确定lowerupper HSV颜色范围后,您可以像这样分割所需的颜色:

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()

相关问题