|
5 | 5 | "id": "8607eb0e", |
6 | 6 | "metadata": {}, |
7 | 7 | "source": [ |
8 | | - "# Julia Sets" |
| 8 | + "# Julia Sets\n", |
| 9 | + "\n", |
| 10 | + "The following is a quick introduction to Julia Sets" |
9 | 11 | ] |
10 | 12 | }, |
11 | 13 | { |
|
17 | 19 | "source": [ |
18 | 20 | "%matplotlib inline\n", |
19 | 21 | "from matplotlib import pyplot as plt\n", |
20 | | - "import numpy as np" |
| 22 | + "import numpy as np\n", |
| 23 | + "import datajoint as dj" |
21 | 24 | ] |
22 | 25 | }, |
23 | 26 | { |
|
90 | 93 | "source": [ |
91 | 94 | "noise_level = 5.0\n", |
92 | 95 | "\n", |
93 | | - "fig, ax = plt.subplots(3, 2, figsize=(10, 16))\n", |
| 96 | + "fig, ax = plt.subplots(3, 2, figsize=(7.5, 12))\n", |
94 | 97 | "for c_, a in zip(c, ax.flatten()):\n", |
95 | 98 | " img = julia(c_, zoom=0.5) \n", |
96 | 99 | " img += np.random.randn(*img.shape) * noise_level\n", |
|
153 | 156 | }, |
154 | 157 | "outputs": [], |
155 | 158 | "source": [ |
156 | | - "fig, ax = plt.subplots(3, 2, figsize=(12, 18))\n", |
| 159 | + "fig, ax = plt.subplots(3, 2, figsize=(6, 9))\n", |
157 | 160 | "for a, (im, title) in zip(\n", |
158 | 161 | " ax.flatten(),\n", |
159 | 162 | " ((img, 'original'), \n", |
|
172 | 175 | "id": "b495345a", |
173 | 176 | "metadata": {}, |
174 | 177 | "source": [ |
175 | | - "# DataJoint Pipeline" |
| 178 | + "# DataJoint Pipeline\n", |
| 179 | + "\n", |
| 180 | + "Now let's build a data pipeline managing Julia sets and their analysis" |
176 | 181 | ] |
177 | 182 | }, |
178 | 183 | { |
|
182 | 187 | "metadata": {}, |
183 | 188 | "outputs": [], |
184 | 189 | "source": [ |
185 | | - "import datajoint as dj" |
| 190 | + "import datajoint as dj\n", |
| 191 | + "\n", |
| 192 | + "schema = dj.Schema('julia')" |
186 | 193 | ] |
187 | 194 | }, |
| 195 | + { |
| 196 | + "cell_type": "code", |
| 197 | + "execution_count": null, |
| 198 | + "id": "edbcdf64", |
| 199 | + "metadata": {}, |
| 200 | + "outputs": [], |
| 201 | + "source": [] |
| 202 | + }, |
188 | 203 | { |
189 | 204 | "cell_type": "code", |
190 | 205 | "execution_count": null, |
191 | 206 | "id": "62067735", |
192 | 207 | "metadata": {}, |
193 | 208 | "outputs": [], |
194 | 209 | "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" |
196 | 233 | ] |
197 | 234 | }, |
198 | 235 | { |
199 | 236 | "cell_type": "code", |
200 | 237 | "execution_count": null, |
201 | | - "id": "4c4ef4a9", |
| 238 | + "id": "0bc39f02", |
202 | 239 | "metadata": {}, |
203 | 240 | "outputs": [], |
204 | 241 | "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 | + ") " |
206 | 249 | ] |
207 | 250 | }, |
208 | 251 | { |
|
211 | 254 | "id": "5630641b", |
212 | 255 | "metadata": {}, |
213 | 256 | "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": [], |
214 | 404 | "source": [] |
215 | 405 | } |
216 | 406 | ], |
217 | 407 | "metadata": { |
218 | 408 | "kernelspec": { |
219 | | - "display_name": "benv", |
| 409 | + "display_name": "Python 3", |
220 | 410 | "language": "python", |
221 | | - "name": "benv" |
| 411 | + "name": "python3" |
222 | 412 | }, |
223 | 413 | "language_info": { |
224 | 414 | "codemirror_mode": { |
|
230 | 420 | "name": "python", |
231 | 421 | "nbconvert_exporter": "python", |
232 | 422 | "pygments_lexer": "ipython3", |
233 | | - "version": "3.10.4" |
| 423 | + "version": "3.9.17" |
234 | 424 | } |
235 | 425 | }, |
236 | 426 | "nbformat": 4, |
|
0 commit comments