Untitled
unknown
plain_text
7 months ago
3.0 kB
5
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