Wrapper Python OpenCV2 (cv2) per ottenere la dimensione dell'immagine?


97

Come ottenere la dimensione di un'immagine in cv2wrapper in Python OpenCV (numpy). C'è un modo corretto per farlo diverso da numpy.shape(). Come posso ottenerlo in queste dimensioni di formato: (larghezza, altezza) elenco?


1
numpy.shapenon è richiamabile. È solo una pianura tuple. Sfortunatamente, può essere lungo 3 o 2 elementi.
Tomasz Gandor

Risposte:


210

cv2utilizza numpyper manipolare le immagini, quindi il modo migliore e corretto per ottenere le dimensioni di un'immagine è usare numpy.shape. Supponendo che tu stia lavorando con immagini BGR, ecco un esempio:

>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
  600 800 3

Nel caso in cui stavi lavorando con immagini binarie, imgavrà due dimensioni, quindi devi cambiare il codice in:height, width = img.shape


23
Oh andiamo. Invece di dare per scontato che l'immagine sarà BGR o mono, scrivi in ​​generale - h, w = img.shape[:2], soprattutto perché l'OP non è interessato alla profondità. (Nemmeno io). Vedi la mia risposta per maggiori dettagli.
Tomasz Gandor


19

Temo che non ci sia un modo "migliore" per ottenere queste dimensioni, tuttavia non è molto doloroso.

Ovviamente il tuo codice dovrebbe essere sicuro sia per le immagini binarie / mono che per quelle multicanale, ma le dimensioni principali dell'immagine vengono sempre prima nella forma dell'array numpy. Se opti per la leggibilità o non vuoi preoccuparti di digitarlo, puoi racchiuderlo in una funzione e dargli un nome che ti piace, ad esempio cv_size:

import numpy as np
import cv2

# ...

def cv_size(img):
    return tuple(img.shape[1::-1])

Se sei su un terminale / ipython, puoi anche esprimerlo con un lambda:

>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)

Scrivere funzioni con defnon è divertente mentre si lavora in modo interattivo.

modificare

Inizialmente pensavo che l'uso [:2]fosse OK, ma la forma numpy lo è (height, width[, depth]), e abbiamo bisogno (width, height), come ad esempio si cv2.resizeaspetta, quindi - dobbiamo usare [1::-1]. Ancora meno memorabile di [:2]. E chi ricorda comunque il reverse slicing?


1
Forse non è molto utile, ma potresti anche tagliarlo comeimg.shape[:2][::-1]
billyjmc

13
Non c'è motivo per cui devi essere innamorato dei due punti tra parentesi indice. return (image.shape [1], image.shape [0]) è sia succinto che leggibile.
mcduffee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.