-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjpeg_encoding_performance_full.py
117 lines (95 loc) · 3.22 KB
/
jpeg_encoding_performance_full.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/env python3
import numpy as np
from simplejpeg import encode_jpeg
import time
from sys import argv
import cv2
from PIL import Image
import io
from turbojpeg import TurboJPEG
cycles = 100
iterations = 25
newImage = True
quality = 75
def randomImage(width, height, reset):
return np.random.randint(0,255,(height,width,3), dtype=np.uint8)
imageNum = 0
def cellImage(width, height, reset = False):
if (reset):
global imageNum
imageNum = 0
im = Image.open(f"cell_images/{imageNum}.jpg").resize((width, height))
imageNum += 1
return np.array(im)
def cv2Process(arr, quality):
cv2_encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),quality]
encoded = cv2.imencode(".jpg", arr, cv2_encode_param)
return len(encoded[1])
def simpleJpegProcess(arr, quality):
jpeg = encode_jpeg(arr, quality)
return len(jpeg)
def pilProcess(arr, quality):
jpeg = io.BytesIO()
im = Image.fromarray(arr, 'RGB')
im.save(jpeg, 'jpeg', quality = quality)
return jpeg.tell()
turboJpeg = TurboJPEG()
def turboProcess(arr, quality):
jpeg = turboJpeg.encode(arr, quality)
return len(jpeg)
def runTest(processFunc, nextImage, width, height, newImage = True, quality = quality):
frame_time_averages = []
sizes = []
if not newImage:
arr = nextImage(width, height, True)
for i in range(cycles):
cyclesize = 0
if newImage:
arr = nextImage(width, height, i == 0)
start = time.time()
for j in range(iterations):
cyclesize += processFunc(arr, quality)
duration = time.time() - start
frame_time_averages.append(duration/iterations*1000)
sizes.append(cyclesize/iterations)
data = np.array(frame_time_averages)
sizes = np.array(sizes)
print(width, height, np.average(data), data.min(), data.max(), np.std(data), np.average(sizes), sizes.min(), sizes.max(), np.std(sizes), quality)
def testAllRes(fullProcess, nextImage):
print("#width height average min max std sizeavg sizemin sizemas sizestd quality")
for width, height in ((640,480),(1280,720), (1640,922), (1640, 1232), (1920,1080), (3280,2464)):
runTest(fullProcess, nextImage, width, height)
def testQualities(processFunc, nextImage, width, height):
print("#width height average min max std sizeavg sizemin sizemas sizestd quality")
for quality in range(25, 96, 10):
runTest(processFunc, nextImage, width, height, True, quality)
def qualities():
width = 1080
height = 720
print("#cv2")
testQualities(cv2Process, nextImage, width, height)
print("\n")
print("#simplejpeg")
testQualities(simpleJpegProcess, nextImage, width, height)
print("\n")
print("#pil")
testQualities(pilProcess, nextImage, width, height)
print("\n")
print("#turbojpeg")
testQualities(turboProcess, nextImage, width, height)
def resolutions():
print("#cv2")
testAllRes(cv2Process, nextImage)
print("\n")
print("#simplejpeg")
testAllRes(simpleJpegProcess, nextImage)
print("\n")
print("#pil")
testAllRes(pilProcess, nextImage)
print("\n")
print("#turbojpeg")
testAllRes(turboProcess, nextImage)
#nextImage = randomImage
nextImage = cellImage
qualities()
#resolutions()