Uzyskiwanie rozmiaru obrazu (szerokość i wysokość) za pomocą Pythona, OpenCV i Pillow(PIL)

Biznes

W Pythonie istnieje kilka bibliotek do obsługi obrazów, takich jak OpenCV i Pillow (PIL). Ta sekcja wyjaśnia, jak uzyskać rozmiar obrazu (szerokość i wysokość) dla każdej z nich.

Możesz uzyskać rozmiar obrazu (szerokość i wysokość) jako tuple używając shape dla OpenCV i size dla Pillow (PIL), ale zauważ, że kolejność każdego z nich jest inna.

Podane są tu następujące informacje.

  • OpenCV
    • ndarray.shape:Uzyskaj rozmiar obrazu (szerokość, wysokość)
      • Dla obrazów kolorowych
      • Dla obrazów w skali szarości (monochromatycznych)
  • Pillow(PIL)
    • size,width,height:Uzyskaj rozmiar obrazu (szerokość, wysokość)

Zobacz poniższy artykuł o tym, jak uzyskać rozmiar (pojemność) pliku zamiast rozmiaru (wielkości) obrazu.

OpenCV: ndarray.shape: Uzyskaj rozmiar obrazu (szerokość, wysokość)

Kiedy plik obrazu jest ładowany do OpenCV, jest on traktowany jako tablica NumPy ndarray, a rozmiar obrazu (szerokość i wysokość) może być uzyskany z atrybutu shape, który wskazuje kształt tablicy ndarray.

Nie tylko w OpenCV, ale także gdy plik graficzny jest ładowany w Pillow i konwertowany do tablicy ndarray, rozmiar obrazu reprezentowanego przez tablicę ndarray jest uzyskiwany przy użyciu shape.

Dla obrazów kolorowych

W przypadku obrazów kolorowych stosuje się następującą trójwymiarową tablicę ndarray.

  • Rząd (wysokość)
  • Rząd (szerokość)
  • Kolor (3)

shape jest tuple'em powyższych elementów.

import cv2

im = cv2.imread('data/src/lena.jpg')

print(type(im))
# <class 'numpy.ndarray'>

print(im.shape)
print(type(im.shape))
# (225, 400, 3)
# <class 'tuple'>

Aby przypisać każdą wartość do zmiennej, rozpakuj tuple w następujący sposób.

h, w, c = im.shape
print('width:  ', w)
print('height: ', h)
print('channel:', c)
# width:   400
# height:  225
# channel: 3

_
Podczas rozpakowywania tuple, powyższe może być umownie przypisane jako zmienna dla wartości, które nie będą później używane. Na przykład, jeśli liczba kolorów (liczba kanałów) nie jest używana, używa się poniższego.

h, w, _ = im.shape
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

Może być również użyty jako taki, określając go przez indeks (index) bez przypisywania go do zmiennej.

print('width: ', im.shape[1])
print('height:', im.shape[0])
# width:  400
# height: 225

(width, height)
Jeśli chcesz uzyskać ten tuple, możesz użyć slice i napisać następujące: cv2.resize(), itd. Jeśli chcesz określić argument według rozmiaru, użyj tego.

print(im.shape[1::-1])
# (400, 225)

Dla obrazów w skali szarości (monochromatycznych)

W przypadku obrazów w skali szarości (monochromatycznych) stosowana jest następująca dwuwymiarowa tablica nd.

  • Rząd (wysokość)
  • Rząd (szerokość)

Kształtem będzie ta tuple.

im_gray = cv2.imread('data/src/lena.jpg', cv2.IMREAD_GRAYSCALE)

print(im_gray.shape)
print(type(im_gray.shape))
# (225, 400)
# <class 'tuple'>

Zasadniczo to samo, co w przypadku obrazów kolorowych.

h, w = im_gray.shape
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

print('width: ', im_gray.shape[1])
print('height:', im_gray.shape[0])
# width:  400
# height: 225

Jeśli chcesz przypisać szerokość i wysokość do zmiennych, możesz to zrobić w następujący sposób, niezależnie od tego, czy obraz jest w kolorze czy w skali szarości.

h, w = im.shape[0], im.shape[1]
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

(width, height)
Jeśli chcesz uzyskać ten tuple, możesz użyć slices i napisać go w następujący sposób. Następujący styl pisania może być używany niezależnie od tego, czy obraz jest w kolorze, czy w skali szarości.

print(im_gray.shape[::-1])
print(im_gray.shape[1::-1])
# (400, 225)
# (400, 225)

Pillow(PIL): size, width, height: Uzyskaj rozmiar obrazu (szerokość, wysokość)

Obiekt obrazu uzyskany w wyniku odczytu obrazu za pomocą Pillow(PIL) posiada następujące atrybuty.

  • size
  • width
  • height

Wielkość jest następującą tuple.
(width, height)

from PIL import Image

im = Image.open('data/src/lena.jpg')

print(im.size)
print(type(im.size))
# (400, 225)
# <class 'tuple'>

w, h = im.size
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

Możesz również uzyskać odpowiednio szerokość i wysokość jako atrybuty.
width, height

print('width: ', im.width)
print('height:', im.height)
# width:  400
# height: 225

To samo dotyczy obrazów w skali szarości (monochromatycznych).

im_gray = Image.open('data/src/lena.jpg').convert('L')

print(im.size)
print('width: ', im.width)
print('height:', im.height)
# (400, 225)
# width:  400
# height: 225