2017-05-06 48 views
0

我试图检测所有的光学圈,但我面临着圆圈边缘相当碎裂的困难。某些地方,由于噪音二元化后,圆圈彼此接触。有没有解决方法?如何在存在噪声的情况下断开圆圈并在边缘断裂时检测圆圈?

pattern = [{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9} 
    ] 
stringLen = len(pattern) 
blobCnts = sum([len(d) for d in pattern]) 

raw_image = cv2.imread(imagePath) 
gray = cv2.cvtColor(raw_image, cv2.COLOR_BGR2GRAY) 
thresh = cv2.threshold(gray, 0, 255, 
      cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1] 

bloblist = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0] 
blobcnts = contours.sort_contours(bloblist)[0] 
contour_list = [] 
sorted_contour = [] 
for blob in blobcnts: 
     approx = cv2.approxPolyDP(blob,0.01*cv2.arcLength(blob,True),True) 
     area = cv2.contourArea(blob) 
     (x,y),r = cv2.minEnclosingCircle(blob) 
     center = (int(x),int(y)) 
     r = int(r) 
     if ((len(approx) >= 8) & (len(approx) <= 23) & (area > 30) & (8 < r < 20)): 
      contour_list.append(blob) 

numlist = [] 
if blobCnts == len(contour_list): 
     for (l, i) in enumerate(np.arange(0, blobCnts, stringLen)): 
      cnts = contours.sort_contours(contour_list[i:i + 10],method="top-to-bottom")[0] 
      numlist.append(cnt) 

print cnt 

回答

0

如果圆圈被填满,使用Canny获得边缘。然后应用霍夫变换。对于缺少像素,遮挡等的圆圈来说,这是强大的。

霍夫在一个“投票”系统上转换工作。每个可能的圈子由每个像素投票(如果它在上面)。接下来你必须根据先前的信息使用它有点不同。如果您知道您只有一个像素,请选择最高。如果你知道你有两个,选择最高,然后排除任何非常接近它的圈(这可能是同一圈的选票),然后选择下一个最高的独立圈。如果你不知道数字,你必须建立你的门槛和你的最小距离之间的圆圈(通常你会想不允许重叠少于四分之一半径)。来自OpenCV的

+0

我申请了,但我不能够微调它按我的要求 – Zara

+0

我实现了,但我怎么能解决所有图像的一些参数?它基于照明改变 – Zara

+0

函数包含为canny定义阈值的param1。我将它设置为最初的30个,当时从100个圈子中我获得了99个圈子,用于少量样本。后来,当我减少它时,检测100个圈子的比率减少了。之后,我首先通过canny检测边缘,然后通过边缘图像作为此函数的输入。从58个样本中只有2个被拒绝。所以,我只想问,这种情况的结论是什么? – Zara