Untitled

 avatar
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