def process_image(args, path): global img, img_src, outline, box img = cv2.imread(path) if img == None or img.size == 0: logging.error("Failed to read %s" % path) exit(1) logging.info("Processing %s..." % path) # Scale the image down if its perimeter exceeds the maximum (if set). img = common.scale_max_perimeter(img, args.max_size) img_src = img.copy() # Perform segmentation. logging.info("- Segmenting...") mask = common.grabcut(img, args.iters, None, args.margin) bin_mask = np.where((mask == cv2.GC_FGD) + (mask == cv2.GC_PR_FGD), 255, 0).astype('uint8') # Obtain contours (all points) from the mask. contour = ft.get_largest_contour(bin_mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # Get bounding rectange of the largest contour. box = cv2.boundingRect(contour) # Get the outline. logging.info("- Obtaining shape...") outline = ft.shape_outline(contour, args.k) # And draw it. logging.info("- Done") draw_outline(0, outline, args.k)
def __get_shape_outline(self, args, bin_mask): """Executes :meth:`features.shape_outline`.""" if self.bin_mask == None: raise ValueError("Binary mask cannot be None") k = getattr(args, 'k', 15) # Obtain contours (all points) from the mask. contour = ft.get_largest_contour(bin_mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) if contour == None: raise ValueError("No contour found for binary image") # Get the outline. outline = ft.shape_outline(contour, k) # Compute the delta's for the horizontal and vertical point pairs. shape = [] for x, y in outline: delta_x = x[0] - x[1] delta_y = y[0] - y[1] shape.append(delta_x) shape.append(delta_y) shape = np.array(shape, dtype=float) # Normalize the features if a scaler is set. if self.scaler: shape = self.scaler.fit_transform(shape) return shape
def get_shape_outline(self, args, bin_mask): if self.bin_mask == None: raise ValueError("Binary mask cannot be None") k = getattr(args, 'k', 15) # Obtain contours (all points) from the mask. contour = ft.get_largest_contour(bin_mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) if contour == None: raise ValueError("No contour found for binary image") # Get the outline. outline = ft.shape_outline(contour, k) # Compute the delta's for the horizontal and vertical point pairs. shape = [] for x, y in outline: delta_x = x[0] - x[1] delta_y = y[0] - y[1] shape.append(delta_x) shape.append(delta_y) # Normalize results. shape = np.array(shape, dtype=np.float32) shape = cv2.normalize(shape, None, -1, 1, cv2.NORM_MINMAX) return shape.ravel()
def process_image(args, path): global img, img_src, outline, box img = cv2.imread(path) if img == None or img.size == 0: logging.error("Failed to read %s" % path) exit(1) logging.info("Processing %s..." % path) # Scale the image down if its perimeter exceeds the maximum (if set). img = common.scale_max_perimeter(img, args.max_size) img_src = img.copy() # Perform segmentation. logging.info("- Segmenting...") mask = common.grabcut(img, args.iters, None, args.margin) bin_mask = np.where((mask == cv2.GC_FGD) + (mask == cv2.GC_PR_FGD), 255, 0).astype("uint8") # Obtain contours (all points) from the mask. contour = ft.get_largest_contour(bin_mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # Get bounding rectange of the largest contour. box = cv2.boundingRect(contour) # Get the outline. logging.info("- Obtaining shape...") outline = ft.shape_outline(contour, args.k) # And draw it. logging.info("- Done") draw_outline(0, outline, args.k)