Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

rogner une image en cercle


Sujet :

Python

  1. #1
    Candidat au Club
    rogner une image en cercle
    Bonsoir à tous,

    Dans le cadre de mon stage, je dois écrire un programme qui calcule le nombre de pixels noirs sur une image. Cependant, je dois travailler seulement sur une partie de l'image (il s'agit d'une piste de frottement circulaire). Pour cela, je dois d'abord rogner l'image en traçant un cercle contenant la piste, puis je dois à nouveau tracer un autre cercle plus petit pour le retirer de l'image.

    J'ai trouvé le programme suivant sur internet; il permet de rogner l'image en traçant un rectangle manuellement. Sauriez-vous comment je peux l'adapter pour tracer un cercle à la place?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ... // ask top point (x,y)
    define int WIDTH = 40;
    define int HEIGHT= 40;
    // cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
    cv2.rectangle(img, (x1, y1), (x2, y2), (255,0,0), 2)
    crop_img = img[x:y, WIDTH:HEIGHT] # Crop from x, y, WIDTH , HEIGHT
    ...



    Merci d'avance pour votre aide!

  2. #2
    Membre éprouvé
    C'est pas plus simple de directement compter les pixels noirs qui sont sur le cercle ?

  3. #3
    Expert confirmé
    hello,
    Quelques petites questions pour mieux cerner le problème :
    l'image est -elle une photo ? Si oui cela m'étonnerait qu'il y ait des pixels de noir pur.
    Peux-tu nous montrer à quoi ressemble cette image ?
    Si tu rentres des coordonnées pour écrire le programme, c'est qu'il y a une intervention sur l'image pour évaluer ces coordonnées. Pourquoi dans ce cas ne pas utiliser un logiciel comme gimp pour détourer ce qui est à exploiter ?
    Si tu utilises opencv pourquoi ne pas utiliser une détection de contour ?
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  4. #4
    Expert éminent sénior
    Salut,

    Citation Envoyé par Lou.p Voir le message
    J'ai trouvé le programme suivant sur internet; il permet de rogner l'image en traçant un rectangle manuellement. Sauriez-vous comment je peux l'adapter pour tracer un cercle à la place?
    Indépendamment des suggestions déjà proposées, une image est un tableau de pixels et "rectangulaire".
    Impossible de la rogner pour devenir "disque" sauf en trichant i.e. rendre "transparents" les pixels extérieurs (au disque).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Bonsoir,

    Merci pour vos réponses rapides.
    En effet, ce serait plus simple de compter directement le nombre de pixels noirs mais mon tuteur m'impose de rogner l'image dans un premier temps.
    L'image est une photo prise au microscope; je préfère ne pas la partager par soucis de confidentialité. J'ai aussi pensé à passer par un logiciel de traitement d'image mais je dois tout faire sur python. Je vais donc essayer d'utiliser cv.drawContours.

  6. #6
    Expert confirmé
    hello,
    pour la détection de contours circulaires avec opencv en python, tu peux aller faire un tour ici :
    detecting-circles-images-using-opencv-hough-circles

    exemple de détection sur une image :


    coordonnées x,y et rayon trouvés :
    >>> [[348 348 225]]
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Expert éminent
    Salut,

    S'il s'agit de détecter des alignements circulaires de pixels noirs la réponse de jurassic pork sera plus appropriée.
    S'il s'agit de détecter n'importe quel pixel noir dans une zone circulaire, voici une méthode d'extraction circulaire d'image avec PyQt5

    Je pars du principe que je veux extraire une zone de centre x = 620, y = 400 et de rayon = 200.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    SOURCE = "~/Images/Nadar _Sarah_Bernhardt.png"
    TARGET = "~/Images/target.png"
    CENTER = 620, 400
    RADIUS = 200
     
    def get_support():
        """Create the pixmap support for the texture.
     
        Returns:
        QPixmap square filled transparent
        """
        color = QtGui.QColor()
        color.setRgb(0, 0, 0, 0)
        pix = QtGui.QPixmap(QtCore.QSize(RADIUS*2, RADIUS*2))
        pix.fill(color)
        return pix
     
    def draw_path(pix):
        """Draw a circular path into the pixmap.
     
        """
        painter = QtGui.QPainter()
        painter.begin(pix)
        rect = QtCore.QRectF(1, 1, RADIUS*2-2, RADIUS*2-2)
        path = QtGui.QPainterPath()
        path.addEllipse(rect)
        painter.drawPath(path)
        painter.end()
        return path
     
    def fill_circle(pix, path, texture):
        """Draw the texture into the shape 'path'.
     
        """
        painter = QtGui.QPainter()
        brush = QtGui.QBrush()
        brush.setTexture(texture)
        painter.begin(pix)     
        painter.fillPath(path, brush)
        painter.end()
     
    def get_texture(base):
        """Returns the sub-region of image at the current coordinate.
     
        Returns:
        QPixmap
        """
        texture = QtGui.QPixmap(QtCore.QSize(RADIUS*2, RADIUS*2))
        irect = QtCore.QRect(CENTER[0]-RADIUS, CENTER[1]-RADIUS,
                                RADIUS*2, RADIUS*2)
        prect = QtCore.QRect(0, 0, RADIUS*2, RADIUS*2)
        painter = QtGui.QPainter()
        painter.begin(texture)
        painter.drawImage(prect, base, irect)
        painter.end()
        return texture
     
    def main():
        image = QtGui.QImage(SOURCE)
        support = get_support()
        circle = draw_path(support)
        texture = get_texture(image)
        fill_circle(support, circle, texture)
        support.save(TARGET)
     
    if __name__ == "__main__":
        app = QtWidgets.QApplication([])
        main()


    Résultat:

  8. #8
    Candidat au Club
    Merci beaucoup pour votre aide!

###raw>template_hook.ano_emploi###