Вопрос или проблема
Мне нужно обнаружить 3 круга на этом изображении, чтобы найти центры и понять, выровнены они или нет, и показать разницу. Изображение, которое я получил, в формате .his, но я конвертировал его в .png с помощью Pillow.
Я использую Python, OpenCV и NumPy
Я пытался раньше использовать Pillow, но у меня не получилось.
В этом коде я получаю только внутренний круг. Но мне нужно 2 или 3 для сравнения. Я не понимаю, как работает HoughCircles.
import numpy as np
import cv2
with open('prueba.his', 'rb') as file:
raw_data = file.read()
data = np.frombuffer(raw_data, dtype="uint16") # Предполагается, что это беззнаковые 16-битные целые числа
data = data[:1024*1024]
data = data.reshape((1024, 1024)).transpose()
if data.shape[0] != 1024 or data.shape[1] != 1024:
print("Предупреждение: размеры данных не соответствуют ожидаемому размеру изображения (1024x1024).")
img = cv2.normalize(data, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8UC1)
cv2.imshow('Данные', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
blurred = cv2.GaussianBlur(img, (5, 5), 0)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(blurred)
circles = cv2.HoughCircles(cl1, cv2.HOUGH_GRADIENT, 1.2, 20,
param1=40, param2=35, minRadius=0, maxRadius=0)
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
for (x, y, r) in circles:
cv2.circle(img, (x, y), r, (255, 255,255), 1)
cv2.imshow('Обнаруженные круги', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ответ или решение
Для реализации задачи по детекции кругов на изображении, которое было преобразовано из формата .his в .png с использованием Python, OpenCV и NumPy, выполните следующие шаги.
Анализ Проблемы
Вы упомянули, что вам необходимо обнаружить 2 или 3 круга для анализа их центров и проверка их выравнивания. Ваша программа на данный момент успешно обнаруживает только один круг, и вы не до конца понимаете, как работает метод HoughCircles
. Давайте разберемся с его использованием и с теми шагами, которые вы можете предпринять для улучшения результата.
Подготовка к Детекции Кругов
-
Предварительная Обработка Изображения:
Прежде чем начать детекцию, важно обеспечить корректную подготовку вашего изображения. Вы уже применяете размытие с использованиемGaussianBlur
, что — хороший первый шаг. Также вы используете контрастно-адаптивное гистограммное равнение (CLAHE), что может помочь улучшить видимость кругов. Убедитесь, что параметры вcreateCLAHE
иGaussianBlur
подобраны оптимально для ваших конкретных изображений. -
Параметры HoughCircles:
Данный метод требует настройки параметров для достижения устойчивости в детекции кругов. Рассмотрим параметры:-
dp: Коэффициент разрешения, где 1.0 означает, что детекция происходит при том же разрешении, что и изображение. Попробуйте уменьшить это значение.
-
minDist: Минимальное расстояние между центрами обнаруженных кругов. Увеличение этого параметра может помочь избежать повторного обнаружения одного и того же круга, если они находятся слишком близко друг к другу.
-
param1: Параметр для градиентного метода (например, порог Canny). Попробуйте разные значения, чтобы увидеть, как они влияют на результаты.
-
param2: Порог для определения центра круга. Увеличение этого значения снизит количество истинных положительных результатов, но повысит качество обнаруженных кругов.
-
minRadius и maxRadius: Установите значения, ограничивающие размер кругов, которые вы хотите обнаружить. Если вы знаете, какой диапазон радиусов ожидается, это поможет избежать ложных срабатываний.
-
Пример Исправленного Кода
Приведенный ниже код включает предложенные изменения:
import numpy as np
import cv2
# Чтение данных из .his файла
with open('prueba.his', 'rb') as file:
raw_data = file.read()
data = np.frombuffer(raw_data, dtype="uint16")
data = data[:1024*1024]
data = data.reshape((1024, 1024)).transpose()
if data.shape[0] != 1024 or data.shape[1] != 1024:
print("Warning: Data dimensions do not match expected image size (1024x1024).")
# Нормализация и преобразование изображения
img = cv2.normalize(data, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8UC1)
# Применение размытия и CLAHE
blurred = cv2.GaussianBlur(img, (7, 7), 0)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(blurred)
# Настройка параметров HoughCircles
circles = cv2.HoughCircles(cl1, cv2.HOUGH_GRADIENT, dp=1, minDist=20,
param1=50, param2=30, minRadius=10, maxRadius=60)
# Рисование кругов на изображении
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
for (x, y, r) in circles:
cv2.circle(img, (x, y), r, (255, 255, 255), 2)
cv2.circle(img, (x, y), 2, (0, 255, 0), 3) # Центр круга
# Отображение результатов
cv2.imshow('Detected Circles', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Оценка Результатов
-
Проверка Выравнивания:
После обнаружения кругов вы можете измерить расстояния между центрами кругов, чтобы оценить их выравнивание. Используйте формулу для расстояния между двумя точками:[ \text{distance} = \sqrt{(x_2 – x_1)^2 + (y_2 – y_1)^2} ]
Сравните полученные расстояния с некоторыми допустимыми значениями, чтобы определить, считаются ли круги выровненными.
-
Визуализация и Анализ:
Оптимальный способ анализа результатов — это визуализация обнаруженных кругов на исходном изображении и их центров. Постарайтесь предоставить ясные аннотации, что значительно упростит понимание результатов.
Заключение
Данная методология и предложенные изменения должны помочь вам успешно выделить все необходимые круги на изображении. Не забывайте настраивать параметры в зависимости от особенностей ваших данных. Успехов в вашей работе!