OpenCV supprimer l'arrière-plan

Je suis en train de supprimer le fond de certaines images, le fait de modifier certaines valeurs et en utilisant des méthodes comme morphologyEx me donne une aceptable résultat, mais quelques trous restant, dans ce dernier cas, les trous de ne pas remplir même itération sur tous les contours et le dessin avec -1. Je peux voir que le seuil d'image est vraiment bonne, l'ensemble de la forme avec des lignes, mais je ne sais pas comment continuer...

Mise à jour
J'ai changé mon code j'ai donc d'obtenir de meilleurs résultats, mais je suis encore en train quelques trous... Si je pouvais remplir ces trous, le script serait parfait.

def get_contrasted(image, type="dark", level=3):
maxIntensity = 255.0 # depends on dtype of image data
phi = 1
theta = 1
if type == "light":
newImage0 = (maxIntensity/phi)*(image/(maxIntensity/theta))**0.5
newImage0 = array(newImage0,dtype=uint8)
return newImage0
elif type == "dark":
newImage1 = (maxIntensity/phi)*(image/(maxIntensity/theta))**level
newImage1 = array(newImage1,dtype=uint8)
return newImage1
def sharp(image, level=3):
f = cv2.GaussianBlur(image, (level,level), level)
f = cv2.addWeighted(image, 1.5, f, -0.5, 0)
return f
original_image = imread('imagen.jpg')
# 1 Convert to gray & Normalize
gray_img = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
gray_img = sharp(get_contrasted(gray_img))
gray_img = normalize(gray_img, None, 0, 255, NORM_MINMAX, CV_8UC1)
imshow("Gray", gray_img)
# 2 Find Threshold
gray_blur = cv2.GaussianBlur(gray_img, (7, 7), 0)
adapt_thresh_im = cv2.adaptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 1)
max_thresh, thresh_im = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
thresh = cv2.bitwise_or(adapt_thresh_im, thresh_im)
# 3 Dilate
gray = cv2.Canny(thresh, 88, 400, apertureSize=3)
gray = cv2.dilate(gray, None, iterations=8)
gray = cv2.erode(gray, None, iterations=8)
imshow("Trheshold", gray)
# 4 Flood
contours, _ = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contour_info = []
for c in contours:
contour_info.append((
c,
cv2.isContourConvex(c),
cv2.contourArea(c),
))
contour_info = sorted(contour_info, key=lambda c: c[2], reverse=True)
max_contour = contour_info[0]
holes = np.zeros(gray_img.shape, np.uint8)
drawContours(holes, max_contour, 0, 255, -1)
imshow("Holes", holes)
mask = cv2.GaussianBlur(holes, (15, 15), 0)
mask = np.dstack([mask] * 3)  # Create 3-channel alpha mask
mask = mask.astype('float32') / 255.0  # Use float matrices,
img = original_image.astype('float32') / 255.0  # for easy blending
masked = (mask * img) + ((1 - mask) * (0,0,1))  # Blend
masked = (masked * 255).astype('uint8')
imshow("Maked", masked)
waitKey()

0 Original

OpenCV supprimer l'arrière-plan

1 Seuil

OpenCV supprimer l'arrière-plan

2 Trous

OpenCV supprimer l'arrière-plan

3 Image Finale

OpenCV supprimer l'arrière-plan

Votre code n'est pas valide code Python. Merci de poster le code sans erreurs de syntaxe (à savoir, un code qui est capable d'exécuter).
Parenthèse de manquant, mis à jour maintenant.
Vous devriez regarder quelques opencv tutoriels sur le masquage de la première. Aussi, regardez ceci: stackoverflow.com/questions/18710428/...
J'ai lu quelques tutoriels, et que stackoverflow question aussi, mais je ne peux pas le faire fonctionner.. Par exemple des tutoriels sur le C++, je suis en utilisant python et je ne sais pas comment le faire en python, par exemple Mat(hsvImg.rows, hsvImg.cols, CV_8UC1, 200) et d'autres choses...
ensuite regarde dans ceci

OriginalL'auteur Robert W. Hunter | 2015-06-30