def black_points(image, thresh=127):
    points = []
    image = as_greyscale(image)
    data = np.array(image.getdata())
    data.shape = image.size[:2]
    width, height = image.size[:2]
    for x in range(width):
        for y in range(height):
            if data[x][y] < thresh:
                points.append((y, x))
    return points
            stats_writer.writerow(row)


def filename_or_file_at(file_path, default_name):
    if not file_path:
        return default_name
    elif os.path.isdir(file_path):
        return os.path.join(file_path, default_name)
    else:
        return file_path


if __name__ == "__main__":
    try:
        args = parse_args()
        image = as_greyscale(Image.open(args.image))
        image_name = base_name_no_ext(args.image)
        filters = read_filters(args.filters)
    except Exception as e:
        print e
        sys.exit(1)

    file_name = image_name + "-" + "-".join(map(base_name_no_ext, args.filters)) + ".csv"
    csv_out = sys.stdout if not args.output else open(filename_or_file_at(args.output, file_name), "w")
    yaml_out = None if not args.yaml else open(args.yaml, "w")
    main(image, image_name, args.rows, args.columns, filters, csv_out,
        yaml_out, args.save_cell_images,
        filter_image_name=args.filtered_image)

    if csv_out != sys.stdout:
        csv_out.close()
def as_black_and_white(image, split_point=128, contrast=False):
    image = as_greyscale(image)
    if contrast:
        image = ImageOps.autocontrast(image)
    image = Image.eval(image, lambda px: 0 if px < split_point else 255)
    return image.convert('1', dither=Image.NONE)