我试图检测所有的光学圆圈但是我遇到了圆形边缘完全断裂的困难。在某处,由于噪音,圆圈在二值化之后相互接触。有没有办法解决它?
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 :(得分:0)
如果圆圈已填满,请使用Canny获取边缘。然后应用霍夫变换。这对于缺少像素,遮挡等的圆圈来说是稳健的。
霍夫改变了“投票”系统的工作。每个可能的圆圈由每个像素投票(如果它在其上)。根据先前的信息,你必须使用它有点不同。如果您知道您只有一个像素,请选择最高像素。如果你知道你有两个,选择最高,然后排除任何非常接近它的圆圈(这可能是同一个圆圈的投票)并采取下一个最高的独立圆圈。如果你不知道这个数字,你必须确定你的阈值和圆圈之间的最小距离(通常你会想要禁止重叠小于四分之一半径)。
答案 1 :(得分:0)
This示例听起来像你的问题(http://docs.opencv.org/trunk/d3/db4/tutorial_py_watershed.html)