Partage
  • Partager sur Facebook
  • Partager sur Twitter

Détection Centre d'une tache

numpy / matplotlib.pyplot / cv2

Sujet résolu
    18 novembre 2019 à 11:47:22

    Bonjour, je souhaite récupérer les centres des taches que me génère ce code : 

    import numpy as np 
    import matplotlib.pyplot as plt 
    import cv2
    
    filtre = 150 # filtre sur 255 
    
    image = cv2.imread("ciel2.jpg")
    imagegris = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #lvl gris
    
    for i in range(0,imagegris.shape[0]):
        for j in range(0,imagegris.shape[1]):
            if imagegris[i,j]<filtre: #on garde que les plus lumineuse
                imagegris[i,j] = 0
    
    imagegris = 255 - imagegris #négatif de notre image le noir sont nos étoiles
    
    
    """visualisation de l'image en gris"""
    plt.imshow(imagegris, cmap = 'gray')  # affiche la matrice de niveaux de gris
    plt.show() # ouvre la fenêtre d’affichage et attend la fin de l’interaction utilisateur
    

    les images sont des images très similaire a celle ci dessous : 

    Si quelqu'un a une idée de comment je peux faire cela, cela m'aiderais beaucoup merci. 

     

    • Partager sur Facebook
    • Partager sur Twitter
      18 novembre 2019 à 13:10:48

      Salut, je te conseil de te tourner vers le module scikit image, j'ai un exemple de code pour un ciel étoilé :

      import matplotlib.pyplot as plt
      import matplotlib.patches as mpatches
      
      from skimage import data, util
      from skimage.filters import threshold_otsu
      from skimage.segmentation import clear_border
      from skimage.measure import label, regionprops
      from skimage.morphology import closing, square, erosion
      from skimage.color import label2rgb, rgb2gray
      
      image1 = data.imread("15740739115479_gris.jpg", plugin='pil')
      image1 = rgb2gray(image1)
      image = util.invert(image1)
      
      # apply threshold
      thresh = threshold_otsu(image)
      bw = closing(image > thresh, square(2))
      
      # remove artifacts connected to image border
      cleared = clear_border(bw)
      
      # label image regions
      label_image = label(cleared)
      image_label_overlay = label2rgb(label_image, image=image)
      
      #Affichage
      fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(16, 8), sharex=True, sharey=True)
      ax1.imshow(image1, cmap=plt.cm.gray)
      ax1.axis('off')
      ax1.set_title('image originale', fontsize=20)
      
      ax2.imshow(image, cmap=plt.cm.gray)
      n = 0
      for region in regionprops(label_image):
          # take regions with large enough areas
          if region.area >= 0:
              n+=1
              minr, minc, maxr, maxc = region.bbox
              rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr,
                                        fill=False, edgecolor='red', linewidth=2)
              y,x = region.centroid
              ax2.add_patch(rect)
              print("{},{}".format(int(x),int(y)))
      
      print("Cette image contient {} étoiles.".format(n))
      ax2.set_axis_off()
      plt.tight_layout()
      plt.show()



      Les resultat sont pas mauvais je trouve, après tu peux affiner avec tes propres valeurs et filtres :

      Le script t'affiche dans la console les positions, il y a certainement des doublons, mais je ne vais pas tout te faire quand même  :lol:

      Edit: J'ai modifié et puis ca joue avec ton image :-°

      -
      Edité par KevKev01 18 novembre 2019 à 14:10:26

      • Partager sur Facebook
      • Partager sur Twitter

      La vie c'est comme une boite de chocolat ça dure moins longtemps chez les gros.

        21 novembre 2019 à 18:57:00

        Salut !

        Alors Merci beaucoup, cela m'a parfaitement aidé à faire ce que j'avais besoin, c'est en plus super rapide !!! J'ai mis un peu de temps à comprendre comment chaque lignes fonctionnes mais je n'ai pas encore tous saisie. La bibliothèque semble super fournit mais étrangement très peu répandu. Pour le moment je n'ai perçu aucune erreur ni doublon.     

        Dans la dernière version de la biblio, on utilise "image1 = data.load("image.jpg")" à la place de "image1 = data.imread("image.jpg", plugin='pil')"

        Je vais jeter un œil à "remove_small_objects"

        Voilà tout, je vais continuer à bosser sur mon programme en tous cas merci beaucoup, vraiment !:D

        • Partager sur Facebook
        • Partager sur Twitter
          22 novembre 2019 à 9:42:05

          Je t'en prie, j'ai volontairement laissé cette ligne : 

          if region.area >= 0:
          Elle te permet de filtrer les objets selon leurs tailles, tu pourrais aussi ajouter une limite haute et filtrer pour des objets supperieur a x et inferieur a y, bon courage pour la suite :D
          • Partager sur Facebook
          • Partager sur Twitter

          La vie c'est comme une boite de chocolat ça dure moins longtemps chez les gros.

          Détection Centre d'une tache

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown