Что я могу сделать, чтобы обнаружить все круги на этом изображении?

Вопрос или проблема

Мне нужно обнаружить 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. Давайте разберемся с его использованием и с теми шагами, которые вы можете предпринять для улучшения результата.

Подготовка к Детекции Кругов

  1. Предварительная Обработка Изображения:
    Прежде чем начать детекцию, важно обеспечить корректную подготовку вашего изображения. Вы уже применяете размытие с использованием GaussianBlur, что — хороший первый шаг. Также вы используете контрастно-адаптивное гистограммное равнение (CLAHE), что может помочь улучшить видимость кругов. Убедитесь, что параметры в createCLAHE и GaussianBlur подобраны оптимально для ваших конкретных изображений.

  2. Параметры 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()

Оценка Результатов

  1. Проверка Выравнивания:
    После обнаружения кругов вы можете измерить расстояния между центрами кругов, чтобы оценить их выравнивание. Используйте формулу для расстояния между двумя точками:

    [ \text{distance} = \sqrt{(x_2 – x_1)^2 + (y_2 – y_1)^2} ]

    Сравните полученные расстояния с некоторыми допустимыми значениями, чтобы определить, считаются ли круги выровненными.

  2. Визуализация и Анализ:
    Оптимальный способ анализа результатов — это визуализация обнаруженных кругов на исходном изображении и их центров. Постарайтесь предоставить ясные аннотации, что значительно упростит понимание результатов.

Заключение

Данная методология и предложенные изменения должны помочь вам успешно выделить все необходимые круги на изображении. Не забывайте настраивать параметры в зависимости от особенностей ваших данных. Успехов в вашей работе!

Оцените материал
Добавить комментарий

Капча загружается...