Pembungkus Python OpenCV2 (cv2) untuk mendapatkan ukuran gambar?

98

Cara mendapatkan ukuran gambar dalam cv2pembungkus dengan Python OpenCV (numpy). Apakah ada cara yang benar untuk melakukan itu selain numpy.shape(). Bagaimana saya bisa mendapatkannya dalam format dimensi ini: daftar (lebar, tinggi)?

xercool
sumber
1
numpy.shapetidak bisa dipanggil. Itu hanya sebuah dataran tuple. Sayangnya, panjangnya bisa 3 atau 2 elemen.
Tomasz Gandor

Jawaban:

211

cv2digunakan numpyuntuk memanipulasi gambar, jadi cara yang tepat dan terbaik untuk mendapatkan ukuran gambar adalah menggunakan numpy.shape. Dengan asumsi Anda bekerja dengan gambar BGR, berikut ini contohnya:

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

Jika Anda bekerja dengan gambar biner, imgakan memiliki dua dimensi, dan oleh karena itu Anda harus mengubah kode ke:height, width = img.shape

jabaldonedo
sumber
23
Oh ayolah. Alih-alih mengasumsikan bahwa gambar akan menjadi BGR atau mono, tulis saja secara umum - h, w = img.shape[:2], terutama karena OP tidak tertarik secara mendalam. (Saya juga tidak). Lihat jawaban saya untuk lebih jelasnya.
Tomasz Gandor
19

Saya khawatir tidak ada cara yang "lebih baik" untuk mendapatkan ukuran ini, namun tidak terlalu menyakitkan.

Tentu saja kode Anda harus aman untuk gambar biner / mono serta gambar multi-saluran, tetapi dimensi utama gambar selalu didahulukan dalam bentuk numpy array. Jika Anda memilih untuk dibaca, atau tidak ingin repot mengetik ini, Anda dapat membungkusnya dalam sebuah fungsi, dan memberinya nama yang Anda suka, misalnya cv_size:

import numpy as np
import cv2

# ...

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

Jika Anda menggunakan terminal / ipython, Anda juga dapat mengekspresikannya dengan lambda:

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

Fungsi menulis dengan deftidak menyenangkan saat bekerja secara interaktif.

Edit

Awalnya saya berpikir bahwa penggunaan [:2]itu OK, tetapi bentuknya yang numpy (height, width[, depth]), dan kita perlu (width, height), seperti yang cv2.resizediharapkan, jadi - kita harus menggunakan [1::-1]. Bahkan kurang berkesan dari [:2]. Dan siapa yang ingat mengiris terbalik?

Tomasz Gandor
sumber
1
Mungkin tidak terlalu membantu, tetapi Anda juga bisa mengirisnya sebagaiimg.shape[:2][::-1]
billyjmc
13
Tidak ada alasan Anda harus jatuh cinta dengan titik dua dalam tanda kurung siku. return (image.shape [1], image.shape [0]) singkat dan mudah dibaca.
mcduffee