Untitled
unknown
plain_text
19 days ago
3.0 kB
4
Indexable
import cv2 import numpy as np import matplotlib.pyplot as plt import math image_path = r'D:\Mirs\gol.jpg' n = int(input("Введи n ")) def process_image(image_path, n): # Загружаем изображение img = cv2.imread(image_path) if img is None: raise ValueError("Не удалось загрузить изображение.") # Показываем оригинал img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.figure(figsize=(12, 6)) plt.subplot(1, 3, 1) plt.imshow(img_rgb) plt.axis('off') plt.title("Оригинал") # Определим цвет фона background_color = img[0, 0] # BGR tolerance = 15 diff = cv2.absdiff(img, background_color) mask = np.any(diff > tolerance, axis=2).astype(np.uint8) * 255 # Определим блоки height, width = mask.shape blocks_per_row = int(math.sqrt(n)) blocks_per_col = math.ceil(n / blocks_per_row) block_width = width // blocks_per_row block_height = height // blocks_per_col output_img = img.copy() for i in range(blocks_per_col): for j in range(blocks_per_row): y_start = i * block_height y_end = (i + 1) * block_height if (i + 1) * block_height < height else height x_start = j * block_width x_end = (j + 1) * block_width if (j + 1) * block_width < width else width block = mask[y_start:y_end, x_start:x_end] if np.any(block > 0): output_img[y_start:y_end, x_start:x_end] = (0, 0, 0) # Создаем маску чёрных участков на выходном изображении black_mask = cv2.inRange(output_img, (0, 0, 0), (0, 0, 0)) # Поиск контуров contours, _ = cv2.findContours(black_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) approx_img = output_img.copy() approx_img = cv2.cvtColor(approx_img, cv2.COLOR_BGR2RGB) print("Найденные объекты и их вершины:") for i, contour in enumerate(contours): # Аппроксимация контура epsilon = 0.02 * cv2.arcLength(contour, True) approx = cv2.approxPolyDP(contour, epsilon, True) print(f"Объект {i + 1}:") for point in approx: x, y = point[0] print(f" Вершина: ({x}, {y})") # Нарисуем вершину cv2.circle(approx_img, (x, y), 4, (255, 0, 0), -1) # Отображение результата plt.subplot(1, 3, 2) processed_rgb = cv2.cvtColor(output_img, cv2.COLOR_BGR2RGB) plt.imshow(processed_rgb) plt.axis('off') plt.title("Закрашено") plt.subplot(1, 3, 3) plt.imshow(approx_img) plt.axis('off') plt.title("Вершины объектов") plt.tight_layout() plt.show() process_image(image_path, n)
Editor is loading...
Leave a Comment