def compute_MCD_weft(weftsPickled, target_path):

    weft_points_list = floatPointList()
    for pickled_path in weftsPickled:
        weft_points_list.extend(pickle.load(open(pickled_path, "rb" )))

    x_vals = [fp.x for fp in weft_points_list]
    y_vals = [fp.y for fp in weft_points_list]

    mean_hor_dist = weft_points_list.getMedianWeftDist()

    min_x = min(x_vals) + 1.5 * mean_hor_dist
    max_x = max(x_vals) - 1.5 * mean_hor_dist
    min_y = min(y_vals) + 1.5 * mean_hor_dist
    max_y = max(y_vals) - 1.5 * mean_hor_dist

    inner_points = floatPointList()
    for pt in weft_points_list:
        if min_x < pt.x < max_x and min_y < pt.y < max_y:
            inner_points.append(pt)

    X = np.zeros([len(inner_points), 3])

    for idx, pt in enumerate(inner_points):
        X[idx,0] = pt.area
        X[idx,1] = pt.right_dist
        X[idx,2] = pt.left_dist

    Y = X[~(X<=0).any(axis=1)]

    robust_cov = MinCovDet(support_fraction=0.8).fit(Y)
    pickle.dump(robust_cov, open(target_path, "wb"))
def detectYarns(hor_name,
                ver_name,
                target_name,
                image=None,
                write_images=False):
    hor = cv2.imread(hor_name, cv2.IMREAD_GRAYSCALE)
    ver = cv2.imread(ver_name, cv2.IMREAD_GRAYSCALE)

    labels_hor = label(hor)
    regions_hor = regionprops(labels_hor)

    labels_ver = label(ver)
    regions_ver = regionprops(labels_ver)

    warp_points_list = floatPointList()
    weft_points_list = floatPointList()

    #Die float-points sind um pwh pixel verschoben, da das erkannte Bild um genau diese Anzahl Pixel kleiner ist als das original
    #Nicht bei fcn!!
    for props in regions_hor:
        y0, x0 = props.centroid
        temp = floatPoint(x=x0,
                          y=y0,
                          label="weft_float",
                          area=props.area,
                          convArea=props.convex_area)
        weft_points_list.append(temp)

    for props in regions_ver:
        y0, x0 = props.centroid
        temp = floatPoint(x=x0,
                          y=y0,
                          label="warp_float",
                          area=props.area,
                          convArea=props.convex_area)
        warp_points_list.append(temp)

    for myFloatPoint in warp_points_list:
        myFloatPoint.find_warp_neighbors(warp_points_list)

    for myFloatPoint in weft_points_list:
        myFloatPoint.find_weft_neighbors(weft_points_list)

    weft_points_list.calcDistances()
    warp_points_list.calcDistances()
    pickle.dump(weft_points_list, open(target_name + '__weft.p', "wb"))
    pickle.dump(warp_points_list, open(target_name + '__warp.p', "wb"))

    float_points_list = floatPointList(warp_points_list + weft_points_list)
    if write_images == True:
        float_points_list.showPoints(image)
        plt.savefig(target_name + '.png', bbox_inches='tight', pad_inches=0)
        plt.close("all")
def correctYarns(file_name_weft,
                 file_name_warp,
                 target_name,
                 image=None,
                 write_images=False):
    weft_points_list = pickle.load(open(file_name_weft, "rb"))
    warp_points_list = pickle.load(open(file_name_warp, "rb"))

    check_consistency_warp(warp_points_list)
    check_consistency_weft(weft_points_list)

    mean_ver_dist = warp_points_list.getMedianWarpDist()
    mean_hor_dist = weft_points_list.getMedianWeftDist()

    patch_single_warp_connections(warp_points_list, mean_ver_dist)
    patch_single_weft_connections(
        weft_points_list,
        mean_hor_dist,
    )

    patchDoubleWarps(warp_points_list, mean_ver_dist)
    patchDoubleWefts(weft_points_list, mean_hor_dist)

    float_points_list = floatPointList(warp_points_list + weft_points_list)
    float_points_list.calcDistances()

    if write_images == True:
        float_points_list.showPoints(image)
        plt.savefig(target_name + '.png')
        plt.close("all")
    pickle.dump(warp_points_list, open(target_name + '__warp.p', "wb"))
    pickle.dump(weft_points_list, open(target_name + '__weft.p', "wb"))
Пример #4
0
def detectDefects_warps(file_name,
                        target_name,
                        robust_cov,
                        image=None,
                        write_images=False,
                        threshold=30):
    #robust_cov = pickle.load(open(MCD_path, "rb" ))
    float_points_list = pickle.load(open(file_name, "rb"))
    for pt in float_points_list:
        pt.faulty = False
    #update distances, since they were changed
    float_points_list.calcDistances()

    x_vals = [fp.x for fp in float_points_list]
    y_vals = [fp.y for fp in float_points_list]

    mean_ver_dist = float_points_list.getMedianWarpDist()

    min_x = min(x_vals) + 0.5 * mean_ver_dist
    max_x = max(x_vals) - 0.5 * mean_ver_dist
    min_y = min(y_vals) + 1.2 * mean_ver_dist
    max_y = max(y_vals) - 1.2 * mean_ver_dist

    inner_points = floatPointList()
    for pt in float_points_list:
        if min_x < pt.x < max_x and min_y < pt.y < max_y:
            inner_points.append(pt)

    #TODO: http://scikit-image.org/docs/dev/api/skimage.measure.html
    X = np.zeros([len(inner_points), 3])

    for idx, pt in enumerate(inner_points):
        X[idx, 0] = pt.area
        X[idx, 1] = pt.lower_dist
        X[idx, 2] = pt.upper_dist

    fault_count, faulty_points = calc_error(X, inner_points, robust_cov,
                                            threshold)

    faults00 = []  # up left
    faults01 = []  # up right
    faults10 = []  # down left
    faults11 = []  # down right

    num_points00 = 0
    num_points01 = 0
    num_points10 = 0
    num_points11 = 0

    mean_x = (max_x + min_x) / 2
    mean_y = (max_y + min_y) / 2
    overlap = 50

    for point in inner_points:
        if point.x < mean_x + overlap and point.y < mean_y + overlap:
            num_points00 += 1
        if point.x > mean_x - overlap and point.y < mean_y + overlap:
            num_points01 += 1
        if point.x < mean_x + overlap and point.y > mean_y - overlap:
            num_points10 += 1
        if point.x > mean_x - overlap and point.y > mean_y - overlap:
            num_points11 += 1

    for point in faulty_points:
        if point.x < mean_x + overlap and point.y < mean_y + overlap:
            faults00.append(point)
        if point.x > mean_x - overlap and point.y < mean_y + overlap:
            faults01.append(point)
        if point.x < mean_x + overlap and point.y > mean_y - overlap:
            faults10.append(point)
        if point.x > mean_x - overlap and point.y > mean_y - overlap:
            faults11.append(point)

    # num_inner_points = inner_points.__len__()
    # density = fault_count / num_inner_points * 100
    # density, max_d = calculate_density(faulty_points)
    density00 = faults00.__len__() / num_points00 * 100
    density01 = faults01.__len__() / num_points01 * 100
    density10 = faults10.__len__() / num_points10 * 100
    density11 = faults11.__len__() / num_points11 * 100

    #print(file_name + " fault count von: " + str(fault_count))
    #print(file_name + " Faults per 100 flt points: " + str(density))

    if write_images == True:
        float_points_list.showPoints(image)
        plt.savefig(target_name + '.png')
        plt.close("all")
    #return fault_count
    return density00, density01, density10, density11