Перейти к содержимому
Compvision.ru
YoloY

Удаление вложенных контуров OpenCV

Recommended Posts

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

 

1.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1. Это студенческая задача?

2. Это одно изображение или есть множество таких изображений?

3. Если есть множество таких изображений, то эту задачу решается применением нейронных сетей, т.к. быстродействие здесь не требуется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×