[英]Convert BGR colored image to grayscale except one color
我想留下黑白(灰度)的彩色圖像,以及原始顏色的感興趣區域。 我有一張彩色 BGR 圖像,我想刪除除一種顏色之外的所有 colors。
像這張樹葉圖像,我想把整個圖像變成黑色和白色,並保留原來的顏色(綠色),或者加強這張圖像中的黃色斑點,使用 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.