- Импорт библиотек: Для работы с изображениями используется библиотека OpenCV. Также импортируем numpy для работы с массивами.
import cv2
import numpy as np
- Загрузка изображения:
image = cv2.imread('task2.png')
- Преобразование изображения в градации серого:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
- Использование метода Хафа для нахождения кругов: Метод Хафа используется для нахождения кругов в изображении.
circles = cv2.HoughCircles(
gray,
cv2.HOUGH_GRADIENT,
dp=1,
minDist=30,
param1=50,
param2=30,
minRadius=10,
maxRadius=100
)
Этот код ищет круги на изображении. Важно правильно подобрать параметры для нахождения кружков.
- Преобразование картинки в цветовое пространство HSV: Цветовое представление HSV удобно для определения насыщенности цвета:
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
- Поиск круга с наибольшей насыщенностью цвета: Если круги найдены, мы определим наиболее насыщенный пиксель в пределах каждого из них.
if circles is not None:
circles = np.uint16(np.around(circles))
max_saturation = -1
best_circle = None
for circle in circles[0, :]:
center_x, center_y, radius = circle
mask = np.zeros_like(gray)
cv2.circle(mask, (center_x, center_y), radius, 255, thickness=-1)
mask_hsv = cv2.bitwise_and(hsv_image, hsv_image, mask=mask)
# Извлекаем максимальную насыщенность (2-й канал будет насыщенностью)
saturation_channel = mask_hsv[:, :, 1]
max_sat = np.max(saturation_channel)
if max_sat > max_saturation:
max_saturation = max_sat
best_circle = circle
- Преобразование остальной части изображения в черно-белое: Мы делаем так, чтобы оставался только круг в цвете, в то время как остальная часть изображения будет черно-белой:
# Создаем черно-белое изображение
gray_colored = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
if best_circle is not None:
center_x, center_y, radius = best_circle
# Создаем маску для оставления одного круга
mask = np.zeros_like(gray)
cv2.circle(mask, (center_x, center_y), radius, (255, 255, 255), thickness=-1)
# Закрашиваем области вне круга черно-белым вариантом изображения
result = np.where(mask[:, :, np.newaxis] > 0, image, gray_colored)
else:
result = gray_colored
- Сохранение результата: Сохраняем итоговое изображение с кромкой нужного круга.
cv2.imwrite('result.png', result)
### Сокращенное объяснение:
- Мы используем метод Хафа для нахождения кругов на изображении.
- Преобразуем изображение в цветовую модель HSV, чтобы извлечь насыщенность для каждого круга.
- Круг с наибольшей насыщенностью остаётся цветным, остальные части изображения становятся черно-белыми.
### Вывод:
Задача относится к компьютерному зрению с использованием Python и библиотеки
. Мы успешно реализовали поиск кругов, их анализ на насыщенность и преобразование части изображения в черно-белый формат.