1#!/bin/ipython
2
3import argparse
4import numpy as np
5import matplotlib.pyplot as plt
6import sys
7
8## general defines
9
10linecolor = "#%x%x%x" % ( 217, 234, 211 )
11markercolor = "#%x%x%x" % ( 217/2, 234/2, 211/2 )
12
13# Draw pretty plot
14def doc_plot(fig, x, y):
15
16  plt.figure(fig.number)
17  fig.clear()
18
19  lines, = plt.plot(x,y)
20  lines.set_color(linecolor)
21  lines.set_linewidth(4)
22  lines.set_marker('o')
23  lines.set_markeredgecolor(markercolor)
24  lines.set_markersize(6)
25  lines.set_markeredgewidth(2)
26
27  axes = fig.get_axes()[0]
28  axes.set_aspect(1)
29  axes.set_ybound(0,1)
30  axes.set_xbound(0,1)
31  axes.grid(True)
32  axes.xaxis.label.set_text(r'$P_{IN}$')
33  axes.xaxis.label.set_fontsize(14)
34  axes.yaxis.label.set_text(r'$P_{OUT}$')
35  axes.yaxis.label.set_fontsize(14)
36
37# Print out interleaved coefficients for HAL3 tonemap curve tags
38def doc_coeff(x,y):
39  coeffs = np.vstack((x, y)).reshape(-1,order='F')
40  coeff_str = "[ "
41  for val in coeffs[:-1]:
42    coeff_str += "%0.4f, " % val
43
44  coeff_str += "%0.4f ]" % coeffs[-1]
45
46  print(coeff_str)
47
48def doc_map(fig, imgMap, index):
49  plt.figure(fig.number)
50  fig.clear()
51  plt.imshow(imgMap - 1, interpolation='nearest')
52  for x in range(0, np.size(imgMap, 1)):
53    for y in range(0, np.size(imgMap, 0)):
54      plt.text(x,y, imgMap[y,x,index], color='white')
55
56  axes = fig.get_axes()[0]
57  axes.set_xticks(range(0, np.size(imgMap, 1)))
58  axes.set_yticks(range(0, np.size(imgMap, 0)))
59
60## Check arguments
61
62parser = argparse.ArgumentParser(description='Draw plots for camera HAL3.x implementation spec doc')
63parser.add_argument('--save_figures', default=False, action='store_true',
64                   help='Save figures as pngs')
65
66args = parser.parse_args()
67
68## Linear mapping
69
70x_lin = np.linspace(0,1,2)
71y_lin = x_lin
72
73lin_fig = plt.figure(1)
74doc_plot(lin_fig, x_lin, y_lin)
75
76lin_title = 'Linear tonemapping curve'
77plt.title(lin_title)
78print(lin_title)
79doc_coeff(x_lin, y_lin)
80
81if args.save_figures:
82  plt.savefig('linear_tonemap.png',bbox_inches='tight')
83
84## Inverse mapping
85
86x_inv = x_lin
87y_inv = 1 - x_lin
88
89inv_fig = plt.figure(2)
90doc_plot(inv_fig, x_inv, y_inv)
91
92inv_title = 'Inverting tonemapping curve'
93plt.title(inv_title)
94print(inv_title)
95doc_coeff(x_inv, y_inv)
96
97if args.save_figures:
98  plt.savefig('inverse_tonemap.png',bbox_inches='tight')
99
100## Gamma 1/2.2
101
102x_gamma = np.linspace(0, 1, 16);
103
104y_gamma = x_gamma**(1/2.2)
105
106gamma_fig = plt.figure(3)
107doc_plot(gamma_fig, x_gamma, y_gamma)
108
109gamma_title = r'$\gamma=1/2.2$ tonemapping curve'
110plt.title(gamma_title)
111print(gamma_title)
112doc_coeff(x_gamma, y_gamma)
113
114if args.save_figures:
115  plt.savefig('gamma_tonemap.png',bbox_inches='tight')
116
117## sRGB curve
118
119x_srgb = x_gamma
120y_srgb = np.where(x_srgb <= 0.0031308, x_srgb * 12.92, 1.055*x_srgb**(1/2.4)-0.055)
121
122srgb_fig = plt.figure(4)
123doc_plot(srgb_fig, x_srgb, y_srgb)
124
125srgb_title = 'sRGB tonemapping curve'
126plt.title(srgb_title)
127print(srgb_title)
128doc_coeff(x_srgb, y_srgb)
129
130if args.save_figures:
131  plt.savefig('srgb_tonemap.png',bbox_inches='tight')
132
133## Sample lens shading map
134
135shadingMapSize = np.array([3, 4])
136shadingMap1 = np.array(
137    [ 1.3, 1.2, 1.15, 1.2,  1.2, 1.2, 1.15, 1.2,  1.1, 1.2, 1.2, 1.2,  1.3, 1.2, 1.3, 1.3,
138      1.2, 1.2, 1.25, 1.1,  1.1, 1.1, 1.1, 1.0,   1.0, 1.0, 1.0, 1.0,  1.2, 1.3, 1.25, 1.2,
139      1.3, 1.2, 1.2, 1.3,   1.2, 1.15, 1.1, 1.2,  1.2, 1.1, 1.0, 1.2,  1.3, 1.15, 1.2, 1.3 ])
140redMap = shadingMap1[0::4].reshape(shadingMapSize)
141greenEMap = shadingMap1[1::4].reshape(shadingMapSize)
142greenOMap = shadingMap1[2::4].reshape(shadingMapSize)
143blueMap = shadingMap1[3::4].reshape(shadingMapSize)
144
145rgbMap = np.dstack( (redMap, (greenEMap + greenOMap) / 2, blueMap) )
146redMap = np.dstack( (redMap, np.zeros(shadingMapSize), np.zeros(shadingMapSize) ) )
147greenEMap = np.dstack( (np.zeros(shadingMapSize), greenEMap, np.zeros(shadingMapSize) ) )
148greenOMap = np.dstack( (np.zeros(shadingMapSize), greenOMap, np.zeros(shadingMapSize) ) )
149blueMap = np.dstack( (np.zeros(shadingMapSize), np.zeros(shadingMapSize), blueMap ) )
150
151redImg = plt.figure(5)
152doc_map(redImg, redMap, 0)
153plt.title('Red lens shading map')
154
155if args.save_figures:
156  plt.savefig('red_shading.png',bbox_inches='tight')
157
158greenEImg = plt.figure(6)
159doc_map(greenEImg, greenEMap, 1)
160plt.title('Green (even rows) lens shading map')
161
162if args.save_figures:
163  plt.savefig('green_e_shading.png',bbox_inches='tight')
164
165greenOImg = plt.figure(7)
166doc_map(greenOImg, greenOMap, 1)
167plt.title('Green (odd rows) lens shading map')
168
169if args.save_figures:
170  plt.savefig('green_o_shading.png',bbox_inches='tight')
171
172blueImg = plt.figure(8)
173doc_map(blueImg, blueMap, 2)
174plt.title('Blue lens shading map')
175
176if args.save_figures:
177  plt.savefig('blue_shading.png',bbox_inches='tight')
178
179rgbImg = plt.figure(9)
180
181rgbImg.clear()
182plt.imshow(1/rgbMap,interpolation='bicubic')
183
184axes = rgbImg.get_axes()[0]
185axes.set_xticks(range(0, np.size(rgbMap, 1)))
186axes.set_yticks(range(0, np.size(rgbMap, 0)))
187
188plt.title('Image of uniform white wall (inverse shading map)')
189
190if args.save_figures:
191  plt.savefig('inv_shading.png',bbox_inches='tight')
192
193# Rec. 709
194x_rec709 = x_gamma
195y_rec709 = np.where(x_rec709 <= 0.018, x_rec709 * 4.500, 1.099*x_rec709**0.45-0.099)
196
197rec709_fig = plt.figure(10)
198doc_plot(rec709_fig, x_rec709, y_rec709)
199
200rec709_title = 'Rec. 709 tonemapping curve'
201plt.title(rec709_title)
202print(rec709_title)
203doc_coeff(x_rec709, y_rec709)
204
205if args.save_figures:
206  plt.savefig('rec709_tonemap.png',bbox_inches='tight')
207
208
209# Show figures
210
211plt.show()
212