Обнаружение круговых областей с помощью OpenCV (с множеством мелких объектов) - PullRequest
0 голосов
/ 19 октября 2018

На исходном рисунке я хотел бы обнаружить круглые области.(железы) Мне удалось узнать очертания областей, но из-за множества более мелких объектов (ядер) я не могу идти дальше.

Моя первоначальная идея заключалась в том, чтобы удалять небольшие объекты с помощью *Функция 1003 * cv2.connectedComponentsWithStats .Но, к сожалению, как показано на рисунке, железистые области также содержат небольшие объекты, они не связаны должным образом.Функция также выбрасывает небольшие области, которые очерчивают железы, оставляя некоторые части вне контуров.

Может ли кто-нибудь помочь мне найти решение этой проблемы?Заранее большое спасибо

Исходное изображение Original picture

Примерный контур желез (с большим количеством мелких предметов в нем) The approximate contour of the glands (with a lot of small objects in it)

После cv2.connectedComponentsWithStats After cv2.connectedComponentsWithStats

1 Ответ

0 голосов
/ 19 октября 2018

OpenCV

Я думаю, что вы можете решить свою задачу, используя преобразование Хафа .Нечто подобное может работать для вас (вам необходимо настроить параметры в соответствии с вашими потребностями):

import sys
import cv2 as cv
import numpy as np


def main(argv):
    filename = argv[0]
    src = cv.imread(filename, cv.IMREAD_COLOR)
    if src is None:
        print ('Error opening image!')
        print ('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')
        return -1

    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

    gray = cv.medianBlur(gray, 5)

    rows = gray.shape[0]
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, rows / 32,
                               param1=100, param2=30,
                               minRadius=20, maxRadius=200)

    if circles is not None:
        circles = np.uint16(np.around(circles))
        for i in circles[0, :]:
            center = (i[0], i[1])
            # circle center
            cv.circle(src, center, 1, (0, 100, 100), 3)
            # circle outline
            radius = i[2]
            cv.circle(src, center, radius, (255, 0, 255), 2)


    cv.imshow("detected circles", src)
    cv.waitKey(0)

    return 0


if __name__ == "__main__":
    main(sys.argv[1:])

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


Нейронные сети

Другим вариантом будет использование нейронной сети для изображениясегментация.Довольно успешный - Mask RCNN.На GitHub уже есть работающая реализация Python: Маска RCNN - Nucleus .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...