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.
原始答案:
HSV色彩空间,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)
类似:
Jer*_*uke 10
使用LAB 色彩空间可以非常轻松地应用阈值来检测绿色。
LAB 颜色空间也有 3 个通道,但与 RGB 对应项(所有 3 个都是颜色通道)不同,LAB 中有2 个颜色通道和1 个亮度通道:
观察下图:
绿色和红色代表 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)
您可以使用简单的 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)
一旦确定了您的颜色范围lower和upperHSV 颜色范围,您就可以像这样分割您想要的颜色:
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)