Python OpenCV2 (cv2) wrapper เพื่อรับขนาดภาพ?


102

วิธีรับขนาดของรูปภาพในcv2Wrapper ใน Python OpenCV (numpy) มีวิธีที่ถูกต้องในการทำนอกเหนือจากnumpy.shape(). ฉันจะรับมันในขนาดรูปแบบเหล่านี้ได้อย่างไร: รายการ (ความกว้างความสูง)


1
numpy.shapeไม่สามารถเรียกใช้ได้ tupleมันเป็นเพียงธรรมดา น่าเสียดายที่อาจมีความยาว 3 หรือ 2 องค์ประกอบ
Tomasz Gandor

คำตอบ:


220

cv2ใช้สำหรับการจัดการกับภาพดังนั้นวิธีการที่เหมาะสมและดีที่สุดที่จะได้รับขนาดของภาพที่จะใช้numpy 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

ในกรณีที่คุณกำลังทำงานกับภาพไบนารีimgจะมีสองมิติดังนั้นคุณต้องเปลี่ยนรหัสเป็น:height, width = img.shape


24
เข้ามา. แทนที่จะสมมติว่าภาพจะเป็น BGR หรือโมโนให้เขียนโดยทั่วไป - h, w = img.shape[:2]โดยเฉพาะอย่างยิ่งเมื่อ OP ไม่สนใจในความลึก (ฉันก็ไม่ใช่) ดูคำตอบของฉันสำหรับรายละเอียดเพิ่มเติม
Tomasz Gandor

1
ฉันพบว่าสิ่งนี้มีประโยชน์: docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/…
djwbrown

19

ฉันกลัวว่าจะไม่มีทาง "ดีกว่า" ที่จะได้ขนาดนี้ แต่มันก็ไม่ได้เจ็บปวดมากนัก

แน่นอนว่าโค้ดของคุณควรปลอดภัยสำหรับทั้งภาพไบนารี / โมโนและแบบหลายแชนเนล แต่ขนาดหลักของรูปภาพมักจะมาก่อนในรูปร่างของอาร์เรย์ที่เป็นตัวเลข หากคุณเลือกที่จะอ่านง่ายหรือไม่ต้องการรบกวนการพิมพ์คุณสามารถรวมไว้ในฟังก์ชันและตั้งชื่อที่คุณต้องการเช่น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]เป็น OK แต่รูปร่าง numpy เป็น(height, width[, depth])และเราต้อง(width, height)เป็นเช่นcv2.resizeคาดดังนั้น - [1::-1]เราจะต้องใช้ [:2]แม้แต่น้อยที่น่าจดจำกว่า แล้วใครจะจำการหั่นแบบย้อนกลับได้ล่ะ?


1
อาจจะไม่เป็นประโยชน์มากนัก แต่คุณสามารถหั่นเป็นimg.shape[:2][::-1]
billyjmc

16
ไม่มีเหตุผลที่คุณจะต้องหลงรักเครื่องหมายทวิภาคในวงเล็บดัชนีของคุณ return (image.shape [1], image.shape [0]) มีทั้งแบบรวบรัดและอ่านได้
mcduffee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.