วิธีที่ 1. เข้าถึงแต่ละพิกเซลของแต่ละ channel โดยตรง
#---------------------------------------------------------------------
import cv2
import numpy as np
import time
img = cv2.imread('01.JPG',cv2.CV_LOAD_IMAGE_COLOR)
rows,cols = img.shape[:2]
start = time.time()
#loop for every row, column and channel
for r in range(rows):
for c in range(cols):
for k in range(3):
img[r,c,k] = 255-img[r,c,k] #Invert color
elapse = time.time()-start
print elapse
#---------------------------------------------------------------------
ใช้เวลา 4.236 วินาที โดยประมาณ
วิธีที่ 2. เข้าถึงแต่ละพิกเซลในทุก channel ทีเดียว
#---------------------------------------------------------------------
for r in range(rows):
for c in range(cols):
img[r,c] = 255-img[r,c]
#---------------------------------------------------------------------
ใช้เวลา 1.239 วินาที โดยประมาณ
วิธีที่ 3. ใช้ numpy ซึ่งเป็นโมดูลเกี่ยวกับการคำนวณของ Python (โดยปกติแล้ว OpenCV จะเก็บภาพอยู่ในรูปแบบของ numpy's array อยู่แล้ว) โดยเราสามารถใช้คำสั่ง img.item(r,c,channel) สำหรับอ่านค่า และคำสั่ง img.itemset(r,c,channel) สำหรับกำหนดค่าให้พิกเซล
#---------------------------------------------------------------------
for r in range(rows):
for c in range(cols):
for k in range(3):
img.itemset((r,c,k),255-img.item(r,c,k))
#---------------------------------------------------------------------
ใช้เวลา 0.820 วินาที โดยประมาณ
วิธีที่ 4. ใช้คำสั่ง cv2.subtract() สำหรับการลบ
#---------------------------------------------------------------------
img = cv2.subtract(255*np.ones(img.shape, np.uint8),img)
#---------------------------------------------------------------------
ใช้เวลา 0.005 วินาที โดยประมาณ
วิธีที่ 5. ใช้ numpy ประมวลผลทั้งรูปโดยไม่ใช้ลูป
#---------------------------------------------------------------------
img = 255-img;
#---------------------------------------------------------------------
ใช้เวลา 0.002 วินาที โดยประมาณ
เวลาที่ใช้อาจแตกต่างกันในแต่ละเครื่องนะครับ และบางวิธีอาจจะใช้ได้เฉพาะงาน
แต่โดยสรุปแล้วถ้าเอาวิธีที่ 1 เป็นตัวเปรียบเทียบ นั่นคือ
ความเร็ววิธีที่ 1 = 1x
ความเร็ววิธีที่ 2 = 3.42x
ความเร็ววิธีที่ 3 = 5.16x
ความเร็ววิธีที่ 4 = 847x
ความเร็ววิธีที่ 5 = 2118x
สามารถศึกษาเพิ่มเติมได้ที่
- http://opencvpython.blogspot.com/2012/06/fast-array-manipulation-in-numpy.html
- http://www.bytefish.de/wiki/python/numpy/performance
No comments:
Post a Comment