2 votes

Trouver la première valeur non nulle dans une image

Je suis assez novice en Python et je voudrais localiser les extrêmes d'une image binaire. Il y a une forme blanche au milieu d'un fond noir et je voudrais localiser le rectangle qui l'entoure en haut, en bas, à gauche et à droite.

Ma façon de procéder consiste à trouver les premiers pixels non nuls dans toutes les directions.

Ma fonction se présente comme suit, mais elle ne fonctionne que sur l'axe des ordonnées. Comment puis-je réussir à passer par l'axe X ?

def first_non_zero(img):
    width = img.shape[1]
    height = img.shape[0]

    idx = 0
    result = 0

    for j in range(0, height):
        idx = np.argmax(img[j])

        if idx > 0:
            result = j
            break

    return result

5voto

Dan Mašek Points 7870

J'utiliserais simplement numpy.nonzero et ensuite trouver le minimum et le maximum pour chaque axe.

script :

import cv2
import numpy as np

img = cv2.imread('blob_in_the_middle.png', cv2.IMREAD_GRAYSCALE)
positions = np.nonzero(img)

top = positions[0].min()
bottom = positions[0].max()
left = positions[1].min()
right = positions[1].max()

output = cv2.rectangle(cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
    , (left, top), (right, bottom), (0,255,0), 1)

cv2.imwrite('blob_with_bounds.png', output)

Entrée de l'échantillon :

Exemple de sortie :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X