Здравствуйте! Занимаюсь распознаванием эритроцитов на медицинских изображениях и при поиске эллипсов находится много вложенных. Пыталась сделать с помощью 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()