Jump to content
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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×