繁体   English   中英

将 BGR 彩色图像转换为除一种颜色以外的灰度图像

[英]Convert BGR colored image to grayscale except one color

我想留下黑白(灰度)的彩色图像,以及原始颜色的感兴趣区域。 我有一张彩色 BGR 图像,我想删除除一种颜色之外的所有 colors。

enter image description here

像这张树叶图像,我想把整个图像变成黑色和白色,并保留原来的颜色(绿色),或者加强这张图像中的黄色斑点,使用 OpenCV 和 python。

我研究了 OpenCV 文档,但没有找到任何有用的东西。 我研究了为此创建一个过滤器,但我也找不到任何东西。

HSV 颜色阈值听起来很适合这种情况。 这个想法是将图像转换为 HSV 格式,然后定义一个较低和较高的范围。 这将使我们能够将图像中所需的对象分割到一个蒙版上,其中要保留的部分为白色,要丢弃的区域为黑色。

我们的想法是获得两张图像:一张代表彩色部分,另一张代表我们想要保留的反转灰度部分。 然后我们简单地将它们组合在一起得到我们的结果。

输入图像:

使用这个 HSV 下限/上限范围,我们可以从图像中分割出绿色

lower = np.array([35, 90, 35])
upper = np.array([179, 255, 255])

彩色->灰色->组合结果

相反,如果您只想要浅绿色,则可以调整阈值范围以去除深绿色

lower = np.array([35, 90, 88])
upper = np.array([179, 255, 255])

彩色->灰色->组合结果

这是黄色的结果

lower = np.array([0, 0, 128])
upper = np.array([29, 255, 255])

代码

import numpy as np
import cv2

image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.merge([gray, gray, gray])
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([35, 90, 88])
upper = np.array([179, 255, 255])
mask = cv2.inRange(hsv, lower, upper)
colored_output = cv2.bitwise_and(image, image, mask=mask)
gray_output = cv2.bitwise_and(gray, gray, mask=255-mask)
result = cv2.add(colored_output, gray_output)

cv2.imshow('colored_output', colored_output)
cv2.imshow('gray_output', gray_output)
cv2.imshow('result', result)
cv2.waitKey()

要确定 HSV 下限/上限范围,您可以将此 HSV 阈值脚本与滑块一起使用,这样您就无需猜测和检查。 只需更改图像路径

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM