Skip to content

Commit 02b70e5

Browse files
add JuliaSet notebook
1 parent 4d1a52e commit 02b70e5

File tree

1 file changed

+202
-12
lines changed

1 file changed

+202
-12
lines changed

short_tutorials/JuliaSets.ipynb

Lines changed: 202 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
"id": "8607eb0e",
66
"metadata": {},
77
"source": [
8-
"# Julia Sets"
8+
"# Julia Sets\n",
9+
"\n",
10+
"The following is a quick introduction to Julia Sets"
911
]
1012
},
1113
{
@@ -17,7 +19,8 @@
1719
"source": [
1820
"%matplotlib inline\n",
1921
"from matplotlib import pyplot as plt\n",
20-
"import numpy as np"
22+
"import numpy as np\n",
23+
"import datajoint as dj"
2124
]
2225
},
2326
{
@@ -90,7 +93,7 @@
9093
"source": [
9194
"noise_level = 5.0\n",
9295
"\n",
93-
"fig, ax = plt.subplots(3, 2, figsize=(10, 16))\n",
96+
"fig, ax = plt.subplots(3, 2, figsize=(7.5, 12))\n",
9497
"for c_, a in zip(c, ax.flatten()):\n",
9598
" img = julia(c_, zoom=0.5) \n",
9699
" img += np.random.randn(*img.shape) * noise_level\n",
@@ -153,7 +156,7 @@
153156
},
154157
"outputs": [],
155158
"source": [
156-
"fig, ax = plt.subplots(3, 2, figsize=(12, 18))\n",
159+
"fig, ax = plt.subplots(3, 2, figsize=(6, 9))\n",
157160
"for a, (im, title) in zip(\n",
158161
" ax.flatten(),\n",
159162
" ((img, 'original'), \n",
@@ -172,7 +175,9 @@
172175
"id": "b495345a",
173176
"metadata": {},
174177
"source": [
175-
"# DataJoint Pipeline"
178+
"# DataJoint Pipeline\n",
179+
"\n",
180+
"Now let's build a data pipeline managing Julia sets and their analysis"
176181
]
177182
},
178183
{
@@ -182,27 +187,65 @@
182187
"metadata": {},
183188
"outputs": [],
184189
"source": [
185-
"import datajoint as dj"
190+
"import datajoint as dj\n",
191+
"\n",
192+
"schema = dj.Schema('julia')"
186193
]
187194
},
195+
{
196+
"cell_type": "code",
197+
"execution_count": null,
198+
"id": "edbcdf64",
199+
"metadata": {},
200+
"outputs": [],
201+
"source": []
202+
},
188203
{
189204
"cell_type": "code",
190205
"execution_count": null,
191206
"id": "62067735",
192207
"metadata": {},
193208
"outputs": [],
194209
"source": [
195-
"schema = dj.Schema('julia')"
210+
"@schema \n",
211+
"class JuliaSpec(dj.Lookup):\n",
212+
" definition = \"\"\"\n",
213+
" julia_spec : smallint \n",
214+
" ---\n",
215+
" creal : float\n",
216+
" cimag : float\n",
217+
" size=256 : smallint\n",
218+
" center_real=0.0 : float \n",
219+
" center_imag=0.0 : float\n",
220+
" zoom=1.0 : float\n",
221+
" noise_level=50 : float\n",
222+
" \"\"\" \n",
223+
"\n",
224+
" contents = (\n",
225+
" dict(julia_spec=0, creal=-0.4, cimag=0.6, noise_level=50),\n",
226+
" dict(julia_spec=1, creal=-0.7453, cimag=0.11301, noise_level=50),\n",
227+
" dict(julia_spec=2, creal=-0.75, cimag=0.11, noise_level=50),\n",
228+
" dict(julia_spec=3, creal=-0.1, cimag=0.651, noise_level=50),\n",
229+
" dict(julia_spec=4, creal=-0.835, cimag=-0.2321, noise_level=50),\n",
230+
" dict(julia_spec=5, creal=-0.70176, cimag=-0.3842, noise_level=50),\n",
231+
" )\n",
232+
"\n"
196233
]
197234
},
198235
{
199236
"cell_type": "code",
200237
"execution_count": null,
201-
"id": "4c4ef4a9",
238+
"id": "0bc39f02",
202239
"metadata": {},
203240
"outputs": [],
204241
"source": [
205-
"img.max()"
242+
"JuliaSpec.insert1(\n",
243+
" dict(julia_spec=10, \n",
244+
" creal=-0.4, cimag=0.6, \n",
245+
" center_real=0.34, center_imag=-0.30, \n",
246+
" zoom=10000.0, \n",
247+
" noise_level=50.0)\n",
248+
") "
206249
]
207250
},
208251
{
@@ -211,14 +254,161 @@
211254
"id": "5630641b",
212255
"metadata": {},
213256
"outputs": [],
257+
"source": [
258+
"@schema\n",
259+
"class JuliaImage(dj.Computed):\n",
260+
" definition = \"\"\"\n",
261+
" -> JuliaSpec \n",
262+
" ---\n",
263+
" image : longblob\n",
264+
" \"\"\"\n",
265+
"\n",
266+
" def make(self, key):\n",
267+
" spec = (JuliaSpec & key).fetch1()\n",
268+
" img = julia(spec['creal'] + 1j*spec['cimag'], \n",
269+
" size=spec['size'],\n",
270+
" center=(spec['center_real'], spec['center_imag']),\n",
271+
" zoom=spec['zoom'],\n",
272+
" )\n",
273+
" img += np.random.randn(*img.shape) * spec['noise_level']\n",
274+
" self.insert1(dict(key, image=img.astype(np.float32)))"
275+
]
276+
},
277+
{
278+
"cell_type": "code",
279+
"execution_count": null,
280+
"id": "1c8e3481",
281+
"metadata": {},
282+
"outputs": [],
283+
"source": [
284+
"JuliaImage.populate(display_progress=True)"
285+
]
286+
},
287+
{
288+
"cell_type": "code",
289+
"execution_count": null,
290+
"id": "560613ef",
291+
"metadata": {},
292+
"outputs": [],
293+
"source": [
294+
"JuliaImage()"
295+
]
296+
},
297+
{
298+
"cell_type": "code",
299+
"execution_count": null,
300+
"id": "76a38851",
301+
"metadata": {},
302+
"outputs": [],
303+
"source": [
304+
"plt.imshow((JuliaImage & 'julia_spec=2').fetch1('image'))\n",
305+
"plt.axis(False);"
306+
]
307+
},
308+
{
309+
"cell_type": "code",
310+
"execution_count": null,
311+
"id": "b108650f",
312+
"metadata": {},
313+
"outputs": [],
314+
"source": [
315+
"@schema\n",
316+
"class DenoiseMethod(dj.Lookup):\n",
317+
" definition = \"\"\"\n",
318+
" denoise_method : smallint\n",
319+
" ---\n",
320+
" method : varchar(16)\n",
321+
" params=null : blob\n",
322+
" \"\"\"\n",
323+
" contents = (\n",
324+
" (0, 'gaussian', dict(sigma=1.8)),\n",
325+
" (1, 'median', dict(radius=3)),\n",
326+
" (2, 'wavelet', {}),\n",
327+
" (3, 'tv', dict(weight=20.0))\n",
328+
" )\n",
329+
"\n"
330+
]
331+
},
332+
{
333+
"cell_type": "code",
334+
"execution_count": null,
335+
"id": "9314c7f5",
336+
"metadata": {},
337+
"outputs": [],
338+
"source": [
339+
"@schema \n",
340+
"class JuliaDenoised(dj.Computed):\n",
341+
" definition = \"\"\"\n",
342+
" -> JuliaImage\n",
343+
" -> DenoiseMethod\n",
344+
" ---\n",
345+
" denoised_image : longblob\n",
346+
" \"\"\"\n",
347+
"\n",
348+
" def make(self, key):\n",
349+
" img = (JuliaImage & key).fetch1('image')\n",
350+
" method, params = (DenoiseMethod & key).fetch1('method', 'params')\n",
351+
"\n",
352+
" if method == \"gaussian\":\n",
353+
" result = filters.gaussian(img, **params)\n",
354+
" elif method == \"median\":\n",
355+
" result = filters.median(img, disk(params['radius']))\n",
356+
" elif method == 'tv':\n",
357+
" result = restoration.denoise_tv_chambolle(img, **params)\n",
358+
" elif method == \"wavelet\":\n",
359+
" result = restoration.denoise_wavelet(noise_img, **params)\n",
360+
" else:\n",
361+
" raise NotImplementedError\n",
362+
" self.insert1(dict(key, denoised_image=result))"
363+
]
364+
},
365+
{
366+
"cell_type": "code",
367+
"execution_count": null,
368+
"id": "834782d9",
369+
"metadata": {},
370+
"outputs": [],
371+
"source": [
372+
"JuliaDenoised.populate(display_progress=True)"
373+
]
374+
},
375+
{
376+
"cell_type": "code",
377+
"execution_count": null,
378+
"id": "f3ad1348",
379+
"metadata": {},
380+
"outputs": [],
381+
"source": [
382+
"JuliaDenoised()"
383+
]
384+
},
385+
{
386+
"cell_type": "code",
387+
"execution_count": null,
388+
"id": "b4b76369",
389+
"metadata": {},
390+
"outputs": [],
391+
"source": [
392+
"keys = JuliaDenoised.fetch('KEY')\n",
393+
"img = ((JuliaDenoised & keys[0])).fetch1('denoised_image')\n",
394+
"plt.imshow(img)\n",
395+
"plt.axis(False);"
396+
]
397+
},
398+
{
399+
"cell_type": "code",
400+
"execution_count": null,
401+
"id": "97601fad",
402+
"metadata": {},
403+
"outputs": [],
214404
"source": []
215405
}
216406
],
217407
"metadata": {
218408
"kernelspec": {
219-
"display_name": "benv",
409+
"display_name": "Python 3",
220410
"language": "python",
221-
"name": "benv"
411+
"name": "python3"
222412
},
223413
"language_info": {
224414
"codemirror_mode": {
@@ -230,7 +420,7 @@
230420
"name": "python",
231421
"nbconvert_exporter": "python",
232422
"pygments_lexer": "ipython3",
233-
"version": "3.10.4"
423+
"version": "3.9.17"
234424
}
235425
},
236426
"nbformat": 4,

0 commit comments

Comments
 (0)