我试图检测所有的光学圈,但我面临着圆圈边缘相当碎裂的困难。某些地方,由于噪音二元化后,圆圈彼此接触。有没有解决方法?如何在存在噪声的情况下断开圆圈并在边缘断裂时检测圆圈?
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
我申请了,但我不能够微调它按我的要求 – Zara
我实现了,但我怎么能解决所有图像的一些参数?它基于照明改变 – Zara
函数包含为canny定义阈值的param1。我将它设置为最初的30个,当时从100个圈子中我获得了99个圈子,用于少量样本。后来,当我减少它时,检测100个圈子的比率减少了。之后,我首先通过canny检测边缘,然后通过边缘图像作为此函数的输入。从58个样本中只有2个被拒绝。所以,我只想问,这种情况的结论是什么? – Zara