На исходной картинке я хотел бы обнаружить круговые области. (желез) Мне удалось узнать контуры регионов, но из-за множества мелких объектов (ядер) я не могу идти дальше.
Моя первоначальная идея заключалась в удалении небольших объектов с помощью функции cv2.connectedComponentsWithStats. Но, к сожалению, как показано на рисунке, в glandy областях также содержат небольшие объекты, они не связаны должным образом. Функция также выбрасывает небольшие области, которые описывают железы, оставляя некоторые части вне контуров.
Может ли кто-нибудь помочь мне найти решение этой проблемы? заранее большое спасибо
Исходное изображение
Примерный контур желез (с большим количеством мелких предметов в нем)
После cv2.connectedComponentsWithStats
Я думаю, что вы можете решить свою задачу, используя преобразование Хафа. Что-то вроде этого может работать для вас (вы должны настроить параметры в соответствии с вашими потребностями):
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
. Уже существует работающая реализация python в GitHub: Mask RCNN - Nucleus.