วิธีรับขนาดของรูปภาพในcv2
Wrapper ใน Python OpenCV (numpy) มีวิธีที่ถูกต้องในการทำนอกเหนือจากnumpy.shape()
. ฉันจะรับมันในขนาดรูปแบบเหล่านี้ได้อย่างไร: รายการ (ความกว้างความสูง)
วิธีรับขนาดของรูปภาพในcv2
Wrapper ใน Python OpenCV (numpy) มีวิธีที่ถูกต้องในการทำนอกเหนือจากnumpy.shape()
. ฉันจะรับมันในขนาดรูปแบบเหล่านี้ได้อย่างไร: รายการ (ความกว้างความสูง)
คำตอบ:
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
h, w = img.shape[:2]
โดยเฉพาะอย่างยิ่งเมื่อ OP ไม่สนใจในความลึก (ฉันก็ไม่ใช่) ดูคำตอบของฉันสำหรับรายละเอียดเพิ่มเติม
ฉันกลัวว่าจะไม่มีทาง "ดีกว่า" ที่จะได้ขนาดนี้ แต่มันก็ไม่ได้เจ็บปวดมากนัก
แน่นอนว่าโค้ดของคุณควรปลอดภัยสำหรับทั้งภาพไบนารี / โมโนและแบบหลายแชนเนล แต่ขนาดหลักของรูปภาพมักจะมาก่อนในรูปร่างของอาร์เรย์ที่เป็นตัวเลข หากคุณเลือกที่จะอ่านง่ายหรือไม่ต้องการรบกวนการพิมพ์คุณสามารถรวมไว้ในฟังก์ชันและตั้งชื่อที่คุณต้องการเช่น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]
แม้แต่น้อยที่น่าจดจำกว่า แล้วใครจะจำการหั่นแบบย้อนกลับได้ล่ะ?
img.shape[:2][::-1]
numpy.shape
ไม่สามารถเรียกใช้ได้tuple
มันเป็นเพียงธรรมดา น่าเสียดายที่อาจมีความยาว 3 หรือ 2 องค์ประกอบ