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"))
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