如何用OpenCV Python检测照片上的黑色轮廓

如何用OpenCV Python检测照片上的黑色轮廓,python,numpy,opencv,image-processing,computer-vision,Python,Numpy,Opencv,Image Processing,Computer Vision,我正试图检测像这样的照片上的黑色形状 到目前为止,我已经有了带形状的图片,但仍然有很多线条和噪音,因此我不能使用FindConteurs(),因为它也是标记线条的。你能在这项任务上给我一些建议或帮助吗。我将非常感谢你的帮助 原始图像 二值图像 import cv2 import numpy as np import imutils def color_seg(choice): if choice == 'blue': lower_hue = np.array([10

我正试图检测像这样的照片上的黑色形状

到目前为止,我已经有了带形状的图片,但仍然有很多线条和噪音,因此我不能使用FindConteurs(),因为它也是标记线条的。你能在这项任务上给我一些建议或帮助吗。我将非常感谢你的帮助

原始图像

二值图像

import cv2
import numpy as np
import imutils

def color_seg(choice):
    if choice == 'blue':
        lower_hue = np.array([100,30,30])
        upper_hue = np.array([150,148,255])
    elif choice == 'white':
        lower_hue = np.array([0,0,0])
        upper_hue = np.array([0,0,255])
    elif choice == 'black':
        lower_hue = np.array([0,0,0])
        upper_hue = np.array([50,50,100])
    return lower_hue, upper_hue


# Take each frame
frame = cv2.imread('11.jpg')
#frame = cv2.imread('images/road_1.jpg')

frame = imutils.resize(frame, height = 500)
chosen_color = 'black'


# Convert BGR to HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

# define range of a color in HSV
lower_hue, upper_hue = color_seg(chosen_color)


# Threshold the HSV image to get only blue colors
mask = cv2.inRange(hsv, lower_hue, upper_hue)


kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(mask,kernel,iterations = 10)
erosion = cv2.filter2D(mask,-1,kernel)
erosion = cv2.GaussianBlur(mask,(5,5),cv2.BORDER_DEFAULT)




cv2.imshow('frame',frame)
cv2.imshow('mask',mask)

cv2.waitKey(0)


你在正确的轨道上。获得二值图像后,需要执行过滤噪声和隔离对象的操作。然后,我们可以找到轮廓,然后使用轮廓近似和轮廓面积进行滤波。我们将检测到的区域绘制到空白遮罩上,然后与原始图像按位合并。以下是步骤:

二值图像

import cv2
import numpy as np
import imutils

def color_seg(choice):
    if choice == 'blue':
        lower_hue = np.array([100,30,30])
        upper_hue = np.array([150,148,255])
    elif choice == 'white':
        lower_hue = np.array([0,0,0])
        upper_hue = np.array([0,0,255])
    elif choice == 'black':
        lower_hue = np.array([0,0,0])
        upper_hue = np.array([50,50,100])
    return lower_hue, upper_hue


# Take each frame
frame = cv2.imread('11.jpg')
#frame = cv2.imread('images/road_1.jpg')

frame = imutils.resize(frame, height = 500)
chosen_color = 'black'


# Convert BGR to HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

# define range of a color in HSV
lower_hue, upper_hue = color_seg(chosen_color)


# Threshold the HSV image to get only blue colors
mask = cv2.inRange(hsv, lower_hue, upper_hue)


kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(mask,kernel,iterations = 10)
erosion = cv2.filter2D(mask,-1,kernel)
erosion = cv2.GaussianBlur(mask,(5,5),cv2.BORDER_DEFAULT)




cv2.imshow('frame',frame)
cv2.imshow('mask',mask)

cv2.waitKey(0)

形态学运算

检测到的区域为绿色

按位运算后的隔离结果

代码


建议:找到轮廓线。然后测量圆度()或偏心率(),并对更圆(圆度或偏心率接近1)且面积在合理范围内的圆度或偏心率进行过滤