簡體   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