Trình bao bọc Python OpenCV2 (cv2) để lấy kích thước hình ảnh?


97

Cách lấy kích thước của hình ảnh trong cv2trình bao bọc trong Python OpenCV (numpy). Có một cách chính xác để làm điều đó ngoài numpy.shape(). Làm cách nào tôi có thể lấy nó ở các kích thước định dạng sau: danh sách (chiều rộng, chiều cao)?


1
numpy.shapekhông thể gọi được. Nó chỉ là một đồng bằng tuple. Thật không may, nó có thể dài 3 hoặc 2 phần tử.
Tomasz Gandor

Câu trả lời:


210

cv2sử dụng numpyđể xử lý hình ảnh, vì vậy, cách thích hợp và tốt nhất để có được kích thước của hình ảnh đang sử dụng numpy.shape. Giả sử bạn đang làm việc với hình ảnh BGR, đây là một ví dụ:

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

Trong trường hợp bạn đang làm việc với hình ảnh nhị phân, imgsẽ có hai chiều và do đó bạn phải thay đổi mã thành:height, width = img.shape


23
Ồ, thôi nào. Thay vì giả định rằng hình ảnh sẽ là BGR hoặc đơn sắc, chỉ cần viết chung chung - h, w = img.shape[:2], đặc biệt là OP không quan tâm đến độ sâu. (Không phải là tôi). Xem câu trả lời của tôi để biết thêm chi tiết.
Tomasz Gandor


19

Tôi e rằng không có cách nào "tốt hơn" để có được kích thước này, tuy nhiên nó không quá đau.

Tất nhiên mã của bạn phải an toàn cho cả hình ảnh nhị phân / đơn sắc cũng như hình ảnh đa kênh, nhưng kích thước chính của hình ảnh luôn đứng đầu trong hình dạng của mảng numpy. Nếu bạn chọn tính dễ đọc, hoặc không muốn nhập cái này, bạn có thể gói nó trong một hàm và đặt cho nó một cái tên bạn thích, ví dụ cv_size:

import numpy as np
import cv2

# ...

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

Nếu bạn đang sử dụng terminal / ipython, bạn cũng có thể thể hiện nó bằng lambda:

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

Viết hàm với defkhông phải là thú vị khi làm việc tương tác.

Biên tập

Ban đầu tôi nghĩ rằng sử dụng [:2]là OK, nhưng hình dạng numpy là (height, width[, depth]), và chúng ta cần (width, height), ví dụ như cv2.resizemong đợi, vì vậy - chúng ta phải sử dụng [1::-1]. Thậm chí ít đáng nhớ hơn [:2]. Và ai còn nhớ phép cắt ngược?


1
Có lẽ không phải là terribly hữu ích, nhưng bạn cũng có thể cắt nó nhưimg.shape[:2][::-1]
billyjmc

13
Không có lý do gì bạn phải yêu dấu hai chấm trong ngoặc chỉ mục của mình. return (image.shape [1], image.shape [0]) vừa ngắn gọn vừa có thể đọc được.
mcduffee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.