如何用OpenCV Python检测照片上的黑色轮廓
我正试图检测像这样的照片上的黑色形状 到目前为止,我已经有了带形状的图片,但仍然有很多线条和噪音,因此我不能使用FindConteurs(),因为它也是标记线条的。你能在这项任务上给我一些建议或帮助吗。我将非常感谢你的帮助 原始图像 二值图像如何用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
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)且面积在合理范围内的圆度或偏心率进行过滤