이미지 크기를 얻으려면 Python OpenCV2 (cv2) 래퍼?


98

cv2Python OpenCV (numpy)의 래퍼에서 이미지 크기를 얻는 방법 . 이외 다른 작업을 수행하는 올바른 방법이 있나요 numpy.shape(). (너비, 높이) 목록 형식으로 어떻게 가져올 수 있습니까?


1
numpy.shape호출 할 수 없습니다. 그것은 단지 평범 tuple합니다. 불행히도 3 개 또는 2 개의 요소 길이가 될 수 있습니다.
Tomasz Gandor 2015 년

답변:


211

cv2numpy이미지를 조작 하는 데 사용 되므로 이미지 크기를 얻는 적절하고 가장 좋은 방법은 numpy.shape. BGR 이미지로 작업한다고 가정하면 다음과 같은 예가 있습니다.

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

이진 이미지로 작업하는 경우 img2 차원이 있으므로 코드를 다음과 같이 변경해야합니다.height, width = img.shape


23
오 어서. 이미지가 BGR 또는 모노라고 가정하는 대신 일반적으로 작성하십시오 h, w = img.shape[:2]. 특히 OP는 깊이에 관심이 없기 때문입니다. (나도 마찬가지였다). 자세한 내용은 내 대답을 참조하십시오.
Tomasz Gandor 2015 년


19

이 크기를 얻을 수있는 "더 나은"방법은 없지만 그다지 고통 스럽지는 않습니다.

물론 코드는 이진 / 모노 이미지와 다중 채널 이미지 모두에 대해 안전해야하지만 이미지의 주요 크기는 항상 numpy 배열의 모양에서 가장 먼저옵니다. 가독성을 선택하거나 이것을 입력하는 것을 귀찮게하고 싶지 않다면 함수로 감싸고 원하는 이름을 지정할 수 있습니다. 예 cv_size:

import numpy as np
import cv2

# ...

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

터미널 / ipython을 사용하는 경우 람다로 표현할 수도 있습니다.

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

def대화식으로 작업하는 동안 함수를 작성하는 것은 재미가 없습니다.

편집하다

원래는 사용하는 [:2]것이 괜찮다고 생각 했지만 numpy 모양은 (height, width[, depth])이고 (width, height)예를 들어 cv2.resize예상 대로를 필요로 하므로을 사용해야합니다 [1::-1]. 보다 덜 기억에 남습니다 [:2]. 어쨌든 리버스 슬라이싱을 기억하는 사람은 누구입니까?


1
어쩌면 정말 도움이되지 않습니다,하지만 당신은 그것을 슬라이스 수img.shape[:2][::-1]
billyjmc

13
색인 괄호 안의 콜론을 좋아할 이유가 없습니다. return (image.shape [1], image.shape [0])은 간결하고 읽기 쉽습니다.
mcduffee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.