import cv2 import numpy as np from random import randint img = cv2.imread('./lenna.png') show_img = np.copy(img) seeds = np.full(img.shape[0:2], 0, np.int32) segmentation = np.full(img.shape, 0, np.uint8) n_seeds = 9 colors = [] for m in range(n_seeds): colors.append((255 * m / n_seeds, randint(0, 255), randint(0, 255))) mouse_pressed = False current_seed = 1 seeds_updated = False def mouse_callback(event, x, y, flags, param): global mouse_pressed, seeds_updated if event == cv2.EVENT_LBUTTONDOWN: mouse_pressed = True cv2.circle(seeds, (x, y), 5, (current_seed), cv2.FILLED) cv2.circle(show_img, (x, y), 5, colors[current_seed - 1], cv2.FILLED) seeds_updated = True elif event == cv2.EVENT_MOUSEMOVE: if mouse_pressed: cv2.circle(seeds, (x, y), 5, (current_seed), cv2.FILLED) cv2.circle(show_img, (x, y), 5, colors[current_seed - 1], cv2.FILLED) seeds_updated = True elif event == cv2.EVENT_LBUTTONUP: mouse_pressed = False cv2.namedWindow('image') cv2.setMouseCallback('image', mouse_callback) while True: cv2.imshow('segmentation', segmentation) cv2.imshow('image', show_img) cv2.imwrite('seg2.png', show_img) cv2.imwrite('seg3.png', segmentation) k = cv2.waitKey(1) if k == 27: break; elif k == ord('c'): show_img = np.copy(img) seeds = np.full(img.shape[0:2], 0, np.int32) segmentation = np.full(img.shape, 0, np.uint8) elif k > 0 and chr(k).isdigit(): n = int(chr(k)) if 1 <= n <= n_seeds and not mouse_pressed: current_seed = n if seeds_updated and not mouse_pressed: seeds_copy = np.copy(seeds) cv2.watershed(img, seeds_copy) segmentation = np.full(img.shape, 0, np.uint8) for m in range(n_seeds): segmentation[seeds_copy == (m + 1)] = colors[m] seeds_updated = False cv2.destroyAllWindows()