import getopt import sys import os from PIL import Image min_threshold = 200 scan_grid_size = 1 options = "hi:" long_options = ["help", "image="] argumentList = sys.argv[1:] arguments, values = getopt.getopt(argumentList, options, long_options) image_name = None for currentArgument, currentValue in arguments: if currentArgument in ("-h", "--help"): print("reader.py --image=image.jpg") sys.exit(0) elif currentArgument in ("-i", "--image"): image_name = currentValue print('image name: ' + image_name) f, e = os.path.splitext(image_name) def convert_coordinates(coords, grid_size): grid_x_center = round(grid_size[0] / 2) grid_y_center = round(grid_size[1] / 2) new_circle_x = coords[0] - grid_x_center new_circle_y = coords[1] - grid_y_center return new_circle_x, new_circle_y def find_circle(image): px = image.load() im_size = image.size print("size: ", im_size) pixel_coords = { 'max_top': {}, 'max_bottom': {}, 'cur_line_max_bottom': {}, 'prev_line_max_bottom': {} } is_prev_line_null = 1 for y in range(0, im_size[1], scan_grid_size): # print("{:3}: ".format(y), end="") is_current_line_not_null = 0 for x in range(0, im_size[0], scan_grid_size): px_colors = px[x, y] intens = 0 if px_colors[1] <= min_threshold else px_colors[1] is_current_line_not_null = is_current_line_not_null + intens if is_prev_line_null: if intens > 0: top_max_intense = 0 if not pixel_coords["max_top"].get("intense") else pixel_coords["max_top"].get( "intense") if intens > top_max_intense: pixel_coords["max_top"] = {"intense": intens, "x": x, "y": y} max_bottom_intense = 0 if not pixel_coords["cur_line_max_bottom"].get("intense") else pixel_coords[ "cur_line_max_bottom"].get("intense") if intens > 0 and intens > max_bottom_intense: pixel_coords["cur_line_max_bottom"] = {"intense": intens, "x": x, "y": y} # print('{:4}'.format(intens), end="") if is_current_line_not_null > 0: is_prev_line_null = 0 pixel_coords["prev_line_max_bottom"] = pixel_coords["cur_line_max_bottom"] pixel_coords["cur_line_max_bottom"] = {} else: if not pixel_coords["max_bottom"]: pixel_coords["max_bottom"] = pixel_coords["prev_line_max_bottom"] # print("") print("") print("coords: ", pixel_coords) x_center = round((pixel_coords["max_bottom"]["x"] + pixel_coords["max_top"]["x"]) / 2) y_center = round((pixel_coords["max_bottom"]["y"] + pixel_coords["max_top"]["y"]) / 2) print("center x: {:3} y: {:3}".format(x_center, y_center)) coords = convert_coordinates((x_center, y_center), im_size) return coords try: with Image.open(image_name) as img: circle_on_image_coords = find_circle(img) print("center coords: ", circle_on_image_coords) except OSError: print("cannot open", image_name)