Cómo eliminar una extensión de una mancha causada por la morfología

Tengo una imagen que estoy erosionando y dilatando así:

kernel = np.ones((5,5),np.float32)/1 eroded_img = cv2.erode(self.inpainted_adjusted_image, kernel, iterations=10) dilated_img = cv2.dilate(eroded_img, kernel, iterations=10) 

Aquí está el resultado de la erosión y dilatación:

introduzca la descripción de la imagen aquí

y luego tomo un umbral de eso así

 self.thresh = cv2.threshold(dilated_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] 

Pero el umbral me da una extensión no deseada que he marcado en la imagen de abajo (la región sobre la línea roja es la región no deseada):

introduzca la descripción de la imagen aquí

¿Cómo me deshago de esta región no deseada? ¿Hay una mejor manera de hacer lo que estoy haciendo?

Trabajar con un tipo diferente de umbral (umbral adaptativo, que toma en cuenta el brillo local) ya eliminará su problema: el resultado del umbral adaptativo es lo que está buscando.

introduzca la descripción de la imagen aquí

[EDITAR: Me he tomado la libertad de agregar un código en los círculos de Hough. Admito que he jugado con los parámetros de esta imagen para obtener un buen resultado, aunque no sé qué tipo de precisión necesita para este tipo de problema]

 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('image.png',0) thresh = cv2.threshold(img, 210, 255, cv2.ADAPTIVE_THRESH_MEAN_C)[1] canny = cv2.Canny(thresh,50,150) cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) circles = cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,20, param1=50,param2=23,minRadius=0,maxRadius=0) circles = np.uint16(np.around(circles)) for i in circles[0,:]: # draw the outer circle cv2.circle(cimg,(i[0],i[1]),i[2],(255,0,0),3) # draw the center of the circle cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3) titles = ['Original Image', 'Adaptive Thresholding', "Canny", "Hough Circle"] images = [img, thresh, canny, cimg] for i in xrange(4): plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() 

Háganos saber si esto todavía no es suficiente.

Desde la imagen binaria sería bastante fácil ajustar un círculo utilizando una transformada de Hough. Una vez que tenga el límite exterior del círculo, sugeriría sangrar el límite y recortar la parte que está fuera del límite.

Otro enfoque es ajustar su valor de umbral. Parece que podría salirse con la suya. Es posible que necesite algunas operaciones morfológicas para obtener una ventaja limpia. El uso de un núcleo de disco ayudará a mantener la forma en buena medida.

Dado que su pregunta se ha revertido a su versión original, he adjuntado una solución que utiliza el relleno de inundación que funciona en sus imágenes.

 import numpy as np import cv2 import sys import matplotlib.pyplot as plt img = cv2.imread('image.png', 0) h, w = img.shape[:2] mask = np.zeros((h+2, w+2), np.uint8) gray = cv2.blur(img,(5,5)) (minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(gray) print maxLoc fixed_range = True connectivity = 4 flooded = img.copy() mask[:] = 0 connectivity = 4 #8 flags = connectivity flags |= cv2.FLOODFILL_FIXED_RANGE cv2.floodFill(flooded, mask, maxLoc, (255, 255, 255), (60,)*3, (60,)*3, flags) thresh = cv2.threshold(flooded, 250, 255, cv2.THRESH_BINARY)[1] titles = ['Original Image', 'Blurred', "Floodfill", "Threshold"] images = [img, gray, flooded, thresh] for i in xrange(4): plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() 

introduzca la descripción de la imagen aquí