YoloY 0 Жалоба Опубликовано May 23, 2019 Здравствуйте! Занимаюсь распознаванием эритроцитов на медицинских изображениях и при поиске эллипсов находится много вложенных. Пыталась сделать с помощью RETR EXTERNAL, но в моем случае работает не всегда. Пытаюсь сделать это с помощью центров и проверять, находится ли центр внутри оболочки, но почему то результаты странные Подскажите пожалуйста, что делаю не так и как это можно исправить import sys import numpy as np import cv2 as cv import math hsv_min = np.array((0, 77, 17), np.uint8) hsv_max = np.array((208, 255, 255), np.uint8) if __name__ == '__main__': img = cv.imread('1.png',0) imgcopy=img sigma = 0.33 # compute the median of the single channel pixel intensities v = np.median(img) # apply automatic Canny edge detection using the computed median lower = int(max(0, (1.0 - sigma) * v)) upper = int(min(255, (1.0 + sigma) * v)) blur = cv.GaussianBlur(img, (7, 7), 0) ret, thr = cv.threshold(blur, 140, 255, cv.THRESH_TRIANGLE) thr = cv.Canny(thr, lower, upper) thrcopy = cv.resize(thr, (960, 540)) cv.imshow("edged.jpg", thrcopy) # RETR_EXTERNAL удаляет внутренние эллипсы но не в моем случае contours0, hierarchy = cv.findContours(thr.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # Find the rotated rectangles and ellipses for each contour minRect = [None] * len(contours0) minEllipse = [None] * len(contours0) for i, c in enumerate(contours0): minRect[i] = cv.minAreaRect(c) if c.shape[0] > 5: minEllipse[i] = cv.fitEllipse(c) count = 1 di=0 for i, c in enumerate(contours0): color = (0, 0, 0) colorOut = (255, 255, 255) # ellipse if c.shape[0] > 5: cv.ellipse(imgcopy, minEllipse[i], colorOut, 2) count = count + 1 # rotated rectangle для нахождения центров box = cv.boxPoints(minRect[i]) box = np.intp(box) # для нахождения центров # находим точки центров эллипсов W = minRect[1][0] H = minRect[1][1] rrr = cv.boundingRect(c) Xs = [i[0] for i in box] Ys = [i[1] for i in box] x1 = min(Xs) x2 = max(Xs) y1 = min(Ys) y2 = max(Ys) center = (int((x1 + x2) / 2), int((y1 + y2) / 2)) dist = cv.pointPolygonTest(c, center, False) if dist < 0: cv.circle(imgcopy, center, 3, (0, 255, 0), -1) di=di+1 if c.shape[0] > 5: cv.ellipse(imgcopy, minEllipse[i], color, 2) print(count - 1) print(di) print(rrr) imgcopy = cv.resize(imgcopy, (960, 540)) cv.imshow('Contoursd', imgcopy) cv.waitKey() cv.destroyAllWindows() Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
2expres 7 Жалоба Опубликовано May 24, 2019 1. Это студенческая задача? 2. Это одно изображение или есть множество таких изображений? 3. Если есть множество таких изображений, то эту задачу решается применением нейронных сетей, т.к. быстродействие здесь не требуется. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах