Обнаружение контура с помощью настраиваемых семян с использованием Python - OpenCV
В этой статье обсуждается, как мы можем динамически определять контуры, нажимая на изображение и назначая разные цвета разным частям изображения. Контуры - очень полезный инструмент для анализа формы и обнаружения и распознавания объектов. Эта программа использует библиотеки OpenCV, Numpy и Matplot. Он также использует встроенный алгоритм OpenCV Watershed для обнаружения контуров.
Требования
- Python и OpenCV должны быть установлены на локальном компьютере.
- Установите Jupyter Notebook для легкой отладки.
- Здесь палитра Matplotlib используется для получения разных цветов. В приведенном ниже примере мы будем использовать tab10. Вы можете выбрать разные цветовые карты. Обратитесь к этому сайту для получения информации о других цветах.
Объяснение
- Запустите программу.
- Щелкните изображение, на котором вы хотите нарисовать контуры.
- Выберите другой цвет для другой части изображения, нажимая цифры от нуля до девяти. (Одно число для одного цвета)
Below is the Implementation.
Python3
# Import modulesimport cv2import numpy as npimport matplotlib.pyplot as pltfrom matplotlib import cm # Upload the image in the same directory and then run the code# If image not found you may get an error# Reading Imageroad = cv2.imread("road_image.jpg") # Making Copy of Imageroad_copy = np.copy(road) # Creating two black image of same size as original imagemarker_image = np.zeros(road.shape[:2], dtype=np.int32)segments = np.zeros(road.shape, dtype=np.uint8) # Function to return tuple of colorsdef create_rgb(i): x = np.array(cm.tab10(i))[:3]*255 return tuple(x) # Storing Colorscolors = [] # One color for each single digitfor i in range(10): colors.append(create_rgb(i)) # Global Variables# Color Choices# Number of markersno_markers = 10 # Current markerscurrent_marker = 1 # Flagmarks_updated = False # CALLBACK FUNCTIONdef mouse_callback(event, x, y, flags, param): global marks_updated if event == cv2.EVENT_LBUTTONDOWN: # TRACKING FOR MARKERS cv2.circle(marker_image, (x, y), 5, (current_marker), -1) # DISPLAY ON USER IMAGE cv2.circle(road_copy, (x, y), 5, colors[current_marker], -1) marks_updated = True # Naming the window and setting call back funtion to itcv2.namedWindow("Road Image")cv2.setMouseCallback("Road Image", mouse_callback) while True: # Show the 2 windows cv2.imshow("WaterShed Segments", segments) cv2.imshow("Road Image", road_copy) # Close everything if Esc is pressed k = cv2.waitKey(1) if k == 27: break # Clear all colors and start over if "c" is pressed elif k == ord("c"): road_copy = road.copy() marker_image = np.zeros(road.shape[0:2], dtype=np.int32) segments = np.zeros(road.shape, dtype=np.uint8) # If a number 0-9 is chosen index the color elif k > 0 and chr(k).isdigit(): # chr converts to printable digit current_marker = int(chr(k)) # If we clicked somewhere, call the watershed # algorithm on our chosen markers if marks_updated: marker_image_copy = marker_image.copy() cv2.watershed(road, marker_image_copy) segments = np.zeros(road.shape, dtype=np.uint8) for color_ind in range(no_markers): # COLORING SEGMENTS segments[marker_image_copy == (color_ind)] = colors[color_ind] marks_updated = False # Destroy all the windows at the endcv2.destroyAllWindows() |
Выход:
Этот код откроет два окна. Один с исходным изображением и один черный. Нажатие на исходное изображение создаст на нем маленькие кружки, а контуры отобразятся на черном изображении. (Нажмите цифры от 0 до 9, чтобы изменить цвета и создать другой контурный график.)

Исходное изображение

Обработанное изображение
Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.