2016-07-11 310 views
0

我想在下面的图像中检测到圆形。图像python中的圆形轮廓检测opencv

enter image description here

所以,我没有颜色的阈值,并终于得到了这样的结果。

enter image description here

因为在中心的线的被去除,圆被分成许多小部分,因此,如果我在此轮廓检测,它只能分别给我每个轮廓。

enter image description here

但是,有没有办法,我能以某种方式结合的轮廓,所以我可以得到一个圆,而不是仅仅将它的一部分?

这里是我的颜色阈值码:

blurred = cv2.GaussianBlur(img, (9,9), 9) 

ORANGE_MIN = np.array((12, 182, 221),np.uint8) 
ORANGE_MAX = np.array((16, 227, 255),np.uint8) 

hsv_disk = cv2.cvtColor(blurred,cv2.COLOR_BGR2HSV) 
disk_threshed = cv2.inRange(hsv_disk, ORANGE_MIN, ORANGE_MAX) 
+0

我会尝试对边缘像素进行hough变换。可能需要找到一个椭球体,因为这不是一个圆圈。 – Photon

回答

0

我想有一个与色彩分割阈值问题,所以这里的想法是生成二进制掩码。通过检查您感兴趣的区域似乎比输入图像的其他区域更亮,因此可以在grayScale图像上简单地完成阈值处理以简化上下文。 注意:您可以按照您的要求更改此步骤。在满足阈值输出后,您可以使用cv2.convexHull()来获得轮廓的凸面形状。

还要记住选择最大的轮廓并忽略小轮廓。下面的代码可以用来生成所需的输出:只有红色的平面上进行,当

import cv2 
import numpy as np 

# Loading the input_image 
img = cv2.imread("/Users/anmoluppal/Downloads/3xGG4.jpg") 
# Converting the input image to grayScale 
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
# Thresholding the image to get binary mask. 
ret, img_thresh = cv2.threshold(img_gray, 145, 255, cv2.THRESH_BINARY) 

# Dilating the mask image 
kernel = np.ones((3,3),np.uint8) 
dilation = cv2.dilate(img_thresh,kernel,iterations = 3) 

# Getting all the contours 
_, contours, __ = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

# Finding the largest contour Id 
largest_contour_area = 0 
largest_contour_area_idx = 0 

for i in xrange(len(contours)): 
    if (cv2.contourArea(contours[i]) > largest_contour_area): 
     largest_contour_area = cv2.contourArea(contours[i]) 
     largest_contour_area_idx = i 

# Get the convex Hull for the largest contour 
hull = cv2.convexHull(contours[largest_contour_area_idx]) 

# Drawing the contours for debugging purposes. 
img = cv2.drawContours(img, [hull], 0, [0, 255, 0]) 
cv2.imwrite("./garbage.png", img) 

enter image description here

1

任务要容易得多。

enter image description here