def _puck_detection(image, approx_radius, tolerance=0.1):
        min_radius = approx_radius * (1-tolerance)
        max_radius = approx_radius * (1+tolerance)

        detector = CircleDetector()
        detector.set_minimum_separation(100000)
        detector.set_minimum_radius(min_radius)
        detector.set_maximum_radius(max_radius)

        circles = detector.find_circles(image)
        return circles
    def _hole_detection(image, avg_barcode_radius):
        # For Unipuck, empty hole radius is about 1.1-1.3 x barcode radius
        MIN_FACTOR = 1.00
        MAX_FACTOR = 1.50

        # For Unipuck, separation between closest neighbours is about 3.7-3.9 x barcode radius
        SEPARATION_FACTOR = 3.6

        min_radius = MIN_FACTOR * avg_barcode_radius
        max_radius = MAX_FACTOR * avg_barcode_radius
        min_dist = SEPARATION_FACTOR * avg_barcode_radius

        detector = CircleDetector()
        detector.set_minimum_radius(min_radius)
        detector.set_maximum_radius(max_radius)
        detector.set_minimum_separation(min_dist)
        circles = detector.find_circles(image)

        return circles