Python OpenCV2 (cv2) sarmalayıcı görüntü boyutunu almak için?


101

cv2Python OpenCV'de (numpy) sarmalayıcıdaki bir görüntünün boyutu nasıl elde edilir . Bunu yapmanın dışında doğru bir yolu var mı numpy.shape()? Bu format boyutlarında nasıl elde edebilirim: (genişlik, yükseklik) listesi?


1
numpy.shapeçağrılabilir değil. Bu sadece düz tuple. Ne yazık ki, 3 veya 2 element uzunluğunda olabilir.
Tomasz Gandor

Yanıtlar:


217

cv2numpygörüntüleri işlemek için kullanır , bu nedenle bir görüntünün boyutunu elde etmenin doğru ve en iyi yolu kullanmaktır numpy.shape. BGR görüntüleri ile çalıştığınızı varsayarsak, işte bir örnek:

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

İkili görüntülerle çalışmanız imgdurumunda, iki boyuta sahip olacaksınız ve bu nedenle kodu şu şekilde değiştirmeniz gerekir:height, width = img.shape


24
Ah, hadi ama. Görüntünün BGR veya mono olacağını varsaymak yerine, genel olarak yazın - h, w = img.shape[:2]özellikle de OP derinlikle ilgilenmediğinden. (Ben de değildim). Daha fazla ayrıntı için cevabıma bakın.
Tomasz Gandor


19

Korkarım bu boyutu elde etmenin "daha iyi" bir yolu yok, ancak o kadar da acı verici değil.

Elbette kodunuz hem ikili / mono görüntüler hem de çok kanallı görüntüler için güvenli olmalıdır, ancak görüntünün temel boyutları her zaman numpy dizisinin biçiminde ilk sırada gelir. Okunabilirliği seçerseniz veya bunu yazmakla uğraşmak istemezseniz, onu bir işleve ekleyebilir ve istediğiniz bir ad verebilirsiniz, örneğin cv_size:

import numpy as np
import cv2

# ...

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

Bir terminal / ipython üzerindeyseniz, bunu bir lambda ile de ifade edebilirsiniz:

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

defEtkileşimli olarak çalışırken fonksiyonları yazmak eğlenceli değildir.

Düzenle

Başlangıçta kullanmanın iyi olduğunu düşünmüştüm [:2], ama uyuşuk şekil (height, width[, depth])ve (width, height)örneğin cv2.resizebeklediği gibi ihtiyacımız var - kullanmalıyız [1::-1]. Daha az akılda kalıcı [:2]. Ve kim ters dilimlemeyi hatırlıyor ki?


1
Belki çok yardımcı olmayabilir, ama aynı zamanda da dilimleyebilirsinizimg.shape[:2][::-1]
billyjmc

15
Dizin parantezinizdeki iki nokta üst üste aşık olmanız için hiçbir neden yok. return (image.shape [1], image.shape [0]) hem kısa hem de okunabilirdir.
mcduffee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.