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
1 Seuil
2 Trous
3 Image Finale
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
ensuite regarde dans ceci
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
Vous devez vous connecter pour publier un commentaire.
De manière itérative effectuer une morphologiques de la fermeture de vos trous de l'image à l'aide d'un noyau de taille croissante. Mais, avant de le faire je vous suggère de redimensionner les trous de l'image (à l'aide du plus proche voisin d'interpolation) de sorte que vous n'avez pas à utiliser d'énormes grains. Dans le code suivant (C++), j'ai redimensionné les trous de l'image à 25% de ses dimensions d'origine.
Pour réduire les effets sur les frontières ajouter une constante de la frontière de zéros à l'aide de copyMakeBorder avant d'appliquer le itératif de clôture. Comme nous utilisons le 15 itérations ici, faire la bordure autour de l'image de plus de 15.
Ainsi, les mesures sont
Le code est en C++. Je ne suis pas très familier avec python.
La sortie (pas à l'échelle d'origine) a l'air bien sauf qu'il prend l'arrière-plan de la région du bas en premier plan.
bordered
est devenu une méthode? Quand?bordered(Rect(b, b, small.cols, small.rows))
et qu'est-ce queRect
? 2:resize(holes, small, Size(), .25, .25)
je n'ai pas unSize()
objet, j'imagine que c'est un n-uplet??, mais je ne peux pas utiliser un tuple vide()
3:morphologyEx(bordered, bordered, MORPH_CLOSE, kernel, Point(-1, -1), 1)
devientbordered = cv2.morphologyEx(bordered, cv2.MORPH_CLOSE, kernel, (-1, -1), 1)
en python mais erreur:new style getargs format but argument is not a tuple
Mat mask = bordered(Rect(b, b, small.cols, small.rows));
extraits spécifié ROI en masque. C'est un opérateur de Tapis de classe. Vous serez en mesure d'obtenir ce travail si vous vous concentrez sur la description que j'ai donnée plutôt que d'essayer de faire un one-to-one mapping du code C++ Python. J'ai ajouté le code en espérant que ce serait rendre la description plus claire.OriginalL'auteur dhanushka
Comme je l'ai été d'aborder le même problème et trouvé une solution en Python (avec opencv2), la pensée de se partager cela ici. Espérons que cela aide.
OriginalL'auteur Gazmend Ajrulovski
@dhanushka la méthode fonctionne très bien. Voici mon pythonic version:
", ligne 11, dans get_holes contour, _ = cv2.findContours(im_bw_inv, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) ValueError: trop de valeurs pour décompresser
OriginalL'auteur Alexander Lutsenko
@grep, selon un post par Alexandre Loutsenko, pour python 3.6.3, pour rendre le code fonctionne, vous devez ajouter une valeur renvoyée à la findContours() comme suit:
contour, _ = cv.findContours(im_bw_inv, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)
à
_, contour, _ = cv.findContours(im_bw_inv, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)
OriginalL'auteur Supp.
essayer ce fonctionnement morphologique pour la dilatation et l'érosion de la suppression des trous dans C++
OriginalL'auteur Mukesh Pareek