Tengo la siguiente imagen de retina y estoy tratando de dibujar un círculo alrededor del disco óptico (la forma redonda blanca en la imagen retiniana). Aquí está la imagen original:

enter image description here

Apliqué el umbral adaptativo y luego cv2.findcontour:

import cv2
def detectBlob(file):
    # read image
    img = cv2.imread(file)
    imageName = file.split('.')[0]
    # convert img to grayscale
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # do adaptive threshold on gray image
    thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 101, 3)

    # apply morphology open then close
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
    blob = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (20,20))
    blob = cv2.morphologyEx(blob, cv2.MORPH_CLOSE, kernel)

    # invert blob
    blob = (255 - blob)

    # Get contours
    cnts,hierarchy = cv2.findContours(blob, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

        # write results to disk
    result = img.copy()
    cv2.drawContours(result, cnts, -1, (0, 0, 255), 3)
    cv2.imwrite(imageName+"_threshold.jpg", thresh)
    cv2.imwrite(imageName+"_blob.jpg", blob)
    cv2.imwrite(imageName+"_contour.jpg", result)

detectBlob('16.png')

Este es el aspecto del umbral:

enter image description here

Aquí está la salida final de los contornos:

enter image description here

Idealmente estoy buscando tal salida:

enter image description here

2
Mohammad 7 may. 2020 a las 14:29

2 respuestas

El umbral adaptativo falla porque el tamaño del filtro es demasiado pequeño. Y aunque no resolvemos esto, las olas en el fondo son bastante perturbadoras.

Obtuve un resultado interesante al reducir la resolución de la imagen en un factor 16 y aplicando un filtro adaptativo de 99x99.

enter image description here

3
Yves Daoust 8 may. 2020 a las 06:33

Necesita identificar estructuras más grandes. Idealmente, necesita un tamaño de estructura de aproximadamente 1/4 del radio del disco óptico para equilibrar los resultados y el tiempo de procesamiento (experimente con tamaños más grandes hasta que sea aceptable).

O podría reducir la imagen (reducir la resolución y hacer que la imagen sea más pequeña), que es más o menos lo mismo, incluso si pierde precisión en los bordes del disco óptico.

-1
LSerni 7 may. 2020 a las 11:48