Created
December 8, 2014 14:47
-
-
Save shashi/54a5b6eb7ba9f0c7ec0c to your computer and use it in GitHub Desktop.
An IJulia solution for http://cs.brown.edu/courses/cs019/2014/Assignments/fluid-images.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"metadata": { | |
"language": "Julia", | |
"name": "", | |
"signature": "sha256:6fd3fbdf5a9279232997cd66865c46af622c9ebebe8f9d28cdb6e297728dae12" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"using Images" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 1 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Download the test images:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"run(`wget http://cs.brown.edu/courses/cs019/2014/Assignments/Fluid-Images/belur-carving-s2.jpg`)\n", | |
"run(`wget http://cs.brown.edu/courses/cs019/2014/Assignments/Fluid-Images/bangalore-dancers-s2.jpg`)\n", | |
"run(`wget http://cs.brown.edu/courses/cs019/2014/Assignments/Fluid-Images/british-museum-s2.jpg`)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"--2014-12-06 14:22:22-- http://cs.brown.edu/courses/cs019/2014/Assignments/Fluid-Images/belur-carving-s2.jpg\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"Resolving cs.brown.edu (cs.brown.edu)... " | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"128.148.32.12\n", | |
"Connecting to cs.brown.edu (cs.brown.edu)|128.148.32.12|:80... " | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"connected.\n", | |
"HTTP request sent, awaiting response... " | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"200 OK\n", | |
"Length: 11428 (11K) [image/jpeg]\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"Saving to: \u2018belur-carving-s2.jpg.5\u2019\n", | |
"\n", | |
" 0K .......... . 100% 167K=0.07s\n", | |
"\n", | |
"2014-12-06 14:22:29 (167 KB/s) - \u2018belur-carving-s2.jpg.5\u2019 saved [11428/11428]\n", | |
"\n", | |
"--2014-12-06 14:22:29-- http://cs.brown.edu/courses/cs019/2014/Assignments/Fluid-Images/bangalore-dancers-s2.jpg\n", | |
"Resolving cs.brown.edu (cs.brown.edu)... 128.148.32.12\n", | |
"Connecting to cs.brown.edu (cs.brown.edu)|128.148.32.12|:80... " | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"connected.\n", | |
"HTTP request sent, awaiting response... " | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"200 OK\n", | |
"Length: 13252 (13K) [image/jpeg]\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"Saving to: \u2018bangalore-dancers-s2.jpg.3\u2019\n", | |
"\n", | |
" 0K .......... ." | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
". 100% 24.0K=0.5s\n", | |
"\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"2014-12-06 14:22:31 (24.0 KB/s) - \u2018bangalore-dancers-s2.jpg.3\u2019 saved [13252/13252]\n", | |
"\n", | |
"--2014-12-06 14:22:31-- http://cs.brown.edu/courses/cs019/2014/Assignments/Fluid-Images/british-museum-s2.jpg\n", | |
"Resolving cs.brown.edu (cs.brown.edu)... 128.148.32.12\n", | |
"Connecting to cs.brown.edu (cs.brown.edu)|128.148.32.12|:80... " | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"connected.\n", | |
"HTTP request sent, awaiting response... " | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"200 OK\n", | |
"Length: 14728 (14K) [image/jpeg]\n" | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"Saving to: \u2018british-museum-s2.jpg.3\u2019\n", | |
"\n", | |
" 0K ..." | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
".." | |
] | |
}, | |
{ | |
"output_type": "stream", | |
"stream": "stderr", | |
"text": [ | |
"..... .... 100% 14.8K=1.0s\n", | |
"\n", | |
"2014-12-06 14:22:34 (14.8 KB/s) - \u2018british-museum-s2.jpg.3\u2019 saved [14728/14728]\n", | |
"\n" | |
] | |
} | |
], | |
"prompt_number": 2 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"What do they contain?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"using Interact\n", | |
"\n", | |
"filenames = [\"belur-carving-s2.jpg\", \"bangalore-dancers-s2.jpg\", \"british-museum-s2.jpg\"]\n", | |
"@manipulate for file in filenames\n", | |
" imread(file)\n", | |
"end" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": [ | |
"<script charset=\"utf-8\">(function ($, undefined) {\n", | |
"\n", | |
" function createElem(tag, attr, content) {\n", | |
"\t// TODO: remove jQuery dependency\n", | |
"\tvar el = $(\"<\" + tag + \"/>\").attr(attr);\n", | |
"\tif (content) {\n", | |
"\t el.append(content);\n", | |
"\t}\n", | |
"\treturn el[0];\n", | |
" }\n", | |
"\n", | |
" // A widget must expose an id field which identifies it to the backend,\n", | |
" // an elem attribute which is will be added to the DOM, and\n", | |
" // a getState() method which returns the value to be sent to the backend\n", | |
" // a sendUpdate() method which sends its current value to the backend\n", | |
" var Widget = {\n", | |
"\tid: undefined,\n", | |
"\telem: undefined,\n", | |
"\tlabel: undefined,\n", | |
"\tgetState: function () {\n", | |
"\t return this.elem.value;\n", | |
"\t},\n", | |
"\tsendUpdate: undefined\n", | |
" };\n", | |
"\n", | |
" var Slider = function (typ, id, init) {\n", | |
"\tvar attr = { type: \"range\",\n", | |
"\t\t value: init.value,\n", | |
"\t\t min: init.min,\n", | |
"\t\t max: init.max,\n", | |
"\t\t step: init.step },\n", | |
"\t elem = createElem(\"input\", attr),\n", | |
"\t self = this;\n", | |
"\n", | |
"\telem.onchange = function () {\n", | |
"\t self.sendUpdate();\n", | |
"\t}\n", | |
"\n", | |
"\tthis.id = id;\n", | |
"\tthis.elem = elem;\n", | |
"\tthis.label = init.label;\n", | |
"\n", | |
"\tInputWidgets.commInitializer(this); // Initialize communication\n", | |
" }\n", | |
" Slider.prototype = Widget;\n", | |
"\n", | |
" var Checkbox = function (typ, id, init) {\n", | |
"\tvar attr = { type: \"checkbox\",\n", | |
"\t\t checked: init.value },\n", | |
"\t elem = createElem(\"input\", attr),\n", | |
"\t self = this;\n", | |
"\n", | |
"\tthis.getState = function () {\n", | |
"\t return elem.checked;\n", | |
"\t}\n", | |
"\telem.onchange = function () {\n", | |
"\t self.sendUpdate();\n", | |
"\t}\n", | |
"\n", | |
"\tthis.id = id;\n", | |
"\tthis.elem = elem;\n", | |
"\tthis.label = init.label;\n", | |
"\n", | |
"\tInputWidgets.commInitializer(this);\n", | |
" }\n", | |
" Checkbox.prototype = Widget;\n", | |
"\n", | |
" var Button = function (typ, id, init) {\n", | |
"\tvar attr = { type: \"button\",\n", | |
"\t\t value: init.label },\n", | |
"\t elem = createElem(\"input\", attr),\n", | |
"\t self = this;\n", | |
"\tthis.getState = function () {\n", | |
"\t return null;\n", | |
"\t}\n", | |
"\telem.onclick = function () {\n", | |
"\t self.sendUpdate();\n", | |
"\t}\n", | |
"\n", | |
"\tthis.id = id;\n", | |
"\tthis.elem = elem;\n", | |
"\tthis.label = init.label;\n", | |
"\n", | |
"\tInputWidgets.commInitializer(this);\n", | |
" }\n", | |
" Button.prototype = Widget;\n", | |
"\n", | |
" var Text = function (typ, id, init) {\n", | |
"\tvar attr = { type: \"text\",\n", | |
"\t\t placeholder: init.label,\n", | |
"\t\t value: init.value },\n", | |
"\t elem = createElem(\"input\", attr),\n", | |
"\t self = this;\n", | |
"\tthis.getState = function () {\n", | |
"\t return elem.value;\n", | |
"\t}\n", | |
"\telem.onkeyup = function () {\n", | |
"\t self.sendUpdate();\n", | |
"\t}\n", | |
"\n", | |
"\tthis.id = id;\n", | |
"\tthis.elem = elem;\n", | |
"\tthis.label = init.label;\n", | |
"\n", | |
"\tInputWidgets.commInitializer(this);\n", | |
" }\n", | |
" Text.prototype = Widget;\n", | |
"\n", | |
" var Textarea = function (typ, id, init) {\n", | |
"\tvar attr = { placeholder: init.label },\n", | |
"\t elem = createElem(\"textarea\", attr, init.value),\n", | |
"\t self = this;\n", | |
"\tthis.getState = function () {\n", | |
"\t return elem.value;\n", | |
"\t}\n", | |
"\telem.onchange = function () {\n", | |
"\t self.sendUpdate();\n", | |
"\t}\n", | |
"\n", | |
"\tthis.id = id;\n", | |
"\tthis.elem = elem;\n", | |
"\tthis.label = init.label;\n", | |
"\n", | |
"\tInputWidgets.commInitializer(this);\n", | |
" }\n", | |
" Textarea.prototype = Widget;\n", | |
"\n", | |
" // RadioButtons\n", | |
" // Dropdown\n", | |
" // HTML\n", | |
" // Latex\n", | |
"\n", | |
" var InputWidgets = {\n", | |
"\tSlider: Slider,\n", | |
"\tCheckbox: Checkbox,\n", | |
"\tButton: Button,\n", | |
"\tText: Text,\n", | |
"\tTextarea: Textarea,\n", | |
"\tdebug: false,\n", | |
"\tlog: function () {\n", | |
"\t if (InputWidgets.debug) {\n", | |
"\t\tconsole.log.apply(console, arguments);\n", | |
"\t }\n", | |
"\t},\n", | |
"\t// a central way to initalize communication\n", | |
"\t// for widgets.\n", | |
"\tcommInitializer: function (widget) {\n", | |
"\t widget.sendUpdate = function () {};\n", | |
"\t}\n", | |
" };\n", | |
"\n", | |
" window.InputWidgets = InputWidgets;\n", | |
"\n", | |
"})(jQuery, undefined);\n", | |
"</script>" | |
], | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"html": [ | |
"<script charset=\"utf-8\">(function (IPython, $, _, MathJax, Widgets) {\n", | |
" $.event.special.destroyed = {\n", | |
"\tremove: function(o) {\n", | |
"\t if (o.handler) {\n", | |
"\t\to.handler.apply(this, arguments)\n", | |
"\t }\n", | |
"\t}\n", | |
" }\n", | |
"\n", | |
" var redrawValue = function (container, type, val) {\n", | |
"\tvar selector = $(\"<div/>\");\n", | |
"\tvar oa = new IPython.OutputArea(_.extend(selector, {\n", | |
"\t selector: selector,\n", | |
"\t prompt_area: true,\n", | |
"\t events: IPython.events,\n", | |
"\t keyboard_manager: IPython.keyboard_manager\n", | |
"\t})); // Hack to work with IPython 2.1.0\n", | |
"\n", | |
"\tswitch (type) {\n", | |
"\tcase \"image/png\":\n", | |
" var _src = 'data:' + type + ';base64,' + val;\n", | |
"\t $(container).find(\"img\").attr('src', _src);\n", | |
"\t break;\n", | |
"\tdefault:\n", | |
"\t var toinsert = IPython.OutputArea.append_map[type].apply(\n", | |
"\t\toa, [val, {}, selector]\n", | |
"\t );\n", | |
"\t $(container).empty().append(toinsert.contents());\n", | |
"\t selector.remove();\n", | |
"\t}\n", | |
"\tif (type === \"text/latex\" && MathJax) {\n", | |
"\t MathJax.Hub.Queue([\"Typeset\", MathJax.Hub, toinsert.get(0)]);\n", | |
"\t}\n", | |
" }\n", | |
"\n", | |
"\n", | |
" $(document).ready(function() {\n", | |
"\tWidgets.debug = false; // log messages etc in console.\n", | |
"\tfunction initComm(evt, data) {\n", | |
"\t var comm_manager = data.kernel.comm_manager;\n", | |
"\t comm_manager.register_target(\"Signal\", function (comm) {\n", | |
"\t\tcomm.on_msg(function (msg) {\n", | |
"\t\t //Widgets.log(\"message received\", msg);\n", | |
"\t\t var val = msg.content.data.value;\n", | |
"\t\t $(\".signal-\" + comm.comm_id).each(function() {\n", | |
"\t\t\tvar type = $(this).data(\"type\");\n", | |
"\t\t\tif (val[type]) {\n", | |
"\t\t\t redrawValue(this, type, val[type], type);\n", | |
"\t\t\t}\n", | |
"\t\t });\n", | |
"\t\t delete val;\n", | |
"\t\t delete msg.content.data.value;\n", | |
"\t\t});\n", | |
"\t });\n", | |
"\n", | |
"\t // coordingate with Comm and redraw Signals\n", | |
"\t // XXX: Test using Reactive here to improve performance\n", | |
"\t $([IPython.events]).on(\n", | |
"\t\t'output_appended.OutputArea', function (event, type, value, md, toinsert) {\n", | |
"\t\t if (md && md.reactive) {\n", | |
"\t\t\t// console.log(md.comm_id);\n", | |
"\t\t\ttoinsert.addClass(\"signal-\" + md.comm_id);\n", | |
"\t\t\ttoinsert.data(\"type\", type);\n", | |
"\t\t\t// Signal back indicating the mimetype required\n", | |
"\t\t\tvar comm_manager = IPython.notebook.kernel.comm_manager;\n", | |
"\t\t\tvar comm = comm_manager.comms[md.comm_id];\n", | |
"\t\t\tcomm.send({action: \"subscribe_mime\",\n", | |
"\t\t\t\t mime: type});\n", | |
"\t\t\ttoinsert.bind(\"destroyed\", function() {\n", | |
"\t\t\t comm.send({action: \"unsubscribe_mime\",\n", | |
"\t\t\t\t mime: type});\n", | |
"\t\t\t});\n", | |
"\t\t }\n", | |
"\t });\n", | |
"\n", | |
"\t // Set up communication for Widgets\n", | |
"\t Widgets.commInitializer = function (widget) {\n", | |
"\t\tvar comm = comm_manager.new_comm(\n", | |
"\t\t \"InputWidget\", {widget_id: widget.id}\n", | |
"\t\t);\n", | |
"\t\twidget.sendUpdate = function () {\n", | |
"\t\t // `this` is a widget here.\n", | |
"\t\t // TODO: I have a feeling there's some\n", | |
"\t\t // IPython bookkeeping to be done here.\n", | |
"\t\t // Widgets.log(\"State changed\", this, this.getState());\n", | |
"\t\t comm.send({value: this.getState()});\n", | |
"\t\t}\n", | |
"\t };\n", | |
"\t}\n", | |
"\n", | |
"\ttry {\n", | |
"\t // try to initialize right away. otherwise, wait on the status_started event.\n", | |
"\t initComm(undefined, IPython.notebook);\n", | |
"\t} catch (e) {\n", | |
"\t $([IPython.events]).on('status_started.Kernel', initComm);\n", | |
"\t}\n", | |
" });\n", | |
"})(IPython, jQuery, _, MathJax, InputWidgets);\n", | |
"</script>" | |
], | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"html": [], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"Options{:ToggleButtons,ASCIIString}([Input{ASCIIString}] belur-carving-s2.jpg,\"file\",\"belur-carving-s2.jpg\",\"belur-carving-s2.jpg\",[\"belur-carving-s2.jpg\"=>\"belur-carving-s2.jpg\",\"bangalore-dancers-s2.jpg\"=>\"bangalore-dancers-s2.jpg\",\"british-museum-s2.jpg\"=>\"british-museum-s2.jpg\"])" | |
] | |
}, | |
{ | |
"metadata": { | |
"comm_id": "dd5abf44-3dfe-46cc-ab98-5668d9cc900e", | |
"reactive": true | |
}, | |
"output_type": "pyout", | |
"png": "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6aef/vSnP71//35VVQsLC51O58MPP9za2uJCbK1ur61uM8f1XD+axQQAsLe394tffAQ01Fp+81vvE2w/fPCEArbU6fZ6vX6//+LFi97JwfLySpml9Xr97HSHMXr9+o35fKLdbhklNDAFF3Gcbm2dsyxLKGW7/tnJyWDQo5S2WwtlnmdZZiBt1L3+2Uhptb/3KknuLC8uUkwIwq2wjjc2nV9yx+PxYND78Y9//P7771+6euXTzx5E0XR7+2aSpo7rEko55wcHe54bRlGEDMAYM5vNFXzLplmWaAUIpe1aGyGwvr5aVOn+7kGt1hJCNBqtIAiqqvB9nwshZOU6fpbnjutSSv/qr/7K9/0XL17MxyEEYSEEgPji1dfevHMH333rTpLGu7svBRfD4fDa1evnz19wbafRaFy7enk2HT/76ukPfvTDex9/nOfV6ur6hYvntra2m82F8+e39/f3pdbXrl3FCCVJmibFgwdf3Lr1BiSw02n7vn94dHR20rcd68bNm59+cm86ixy/9u1vftBshVLKp48fP3r4uCqLOI4azWAymRRl1u22r167XFbFZDI7d/5Co9mCSH/2+afNZi2oNTDCju24njOZTDvtxSQvXMu6ceP6We/06PgorAejwXA6nZ07d7436LUXWpZlOY4DgIqimWW5S0vLGxsbs9ns9ddvaa2++c1vfuub375y5VqaZu+++55ScjabzYtSv9+v1+sH+3v3PvkUY3zr1q0gCDDC5snjp9BAv1bb3t5eX19HCC4vL7ZajYrnQeB32+3Lly9lWRoGddt2znqnSZLVauFZ7+T09LTb6Vy+dIkQMh6PR6Ph559//q1vfoAhXOo29/de5Vmyf3CwsbGxvb39//6//7beaK1vbvmu3+sd9/v90dnZaNA7PT5+9uLpz3/y008/+3g6nm5tb+V59vnn9995513G7CdPHj99+HA2GR4d7J2cDhCEjXqdWUwIqaQ52j98443XEYIYo0ajMZvGR0cnCKHXXnvti/v3O512t9uVUlo2yfOyLPjGxkZZlt1uV4jq7t27jLHd3d0knW2f29w/2K3XG++9954x5uTkhFLKGFtb3/zud78rlGwvLERRRLbWz1+9bEmht8+fm80mz58/j5MZY+z4+LjVaLZaTULoysry9773vdOT/p/+6Q+XV5e2t8+naZzlSb/f/853vsNsO57N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", | |
"prompt_number": 3, | |
"text": [ | |
"RGB Image with:\n", | |
" data: 100x75 Array{RGB{UfixedBase{Uint8,8}},2}\n", | |
" properties:\n", | |
" IMcs: sRGB\n", | |
" spatialorder: x y\n", | |
" pixelspacing: 1 1" | |
] | |
} | |
], | |
"prompt_number": 3 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"size(imread(\"belur-carving-s2.jpg\")) # small enough?" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 4, | |
"text": [ | |
"(100,75)" | |
] | |
} | |
], | |
"prompt_number": 4 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Code for calculating pixel properties" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"brightness(color) = color.r + color.g + color.b\n", | |
"\n", | |
"function getvalue(img, i, j)\n", | |
" w, h = size(img)\n", | |
" if i < 1 || j < 1 || i > w || j > h\n", | |
" return 0.0f0\n", | |
" end\n", | |
" return brightness(img[i, j])\n", | |
"end\n", | |
"\n", | |
"function energy(img, i, j)\n", | |
" # A B C\n", | |
" # D E F\n", | |
" # G H I\n", | |
" w, h = size(img)\n", | |
" a, d, g, b, e, h, c, f, i = [getvalue(img, x, y) for x=i-1:i+1, y=j-1:j+1]\n", | |
" xenergy=a + 2d + g - c - 2f - i\n", | |
" yenergy=a + 2b + c - g - 2h - i\n", | |
" \u221a((xenergy^2) + (yenergy^2))\n", | |
"end" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 5, | |
"text": [ | |
"energy (generic function with 1 method)" | |
] | |
} | |
], | |
"prompt_number": 5 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"A type for representing a map of min-seam direction" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"immutable Next\n", | |
" direction::Int8\n", | |
" energy::Float32\n", | |
"end # Next takes 8+32=40 contigious bytes" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 6 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"`markminpaths` marks the seams from a given x, y coordinate" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"function mapseams!(img, mem, x, y=1)\n", | |
" # virtical seam starting with (x, y)\n", | |
"\n", | |
" w, h = size(img)\n", | |
" if x > w || x < 1\n", | |
" return Next(3, Inf)\n", | |
" end\n", | |
" if y > h || y < 1\n", | |
" return Next(3, 0.0f0)\n", | |
" end\n", | |
" if mem[x, y].direction != 2\n", | |
" return mem[x, y]\n", | |
" end\n", | |
"\n", | |
" next = mapseams!(img, mem, x-1, y+1)\n", | |
" E = next.energy\n", | |
" next_dir = -1\n", | |
" for i in [x, x+1] # two more paths to explore\n", | |
" tmp = mapseams!(img, mem, i, y+1)\n", | |
" if tmp.energy < E\n", | |
" E = tmp.energy\n", | |
" next_dir = i-x\n", | |
" end\n", | |
" end\n", | |
" res = Next(next_dir, E + energy(img, x, y))\n", | |
" mem[x, y] = res\n", | |
" return res\n", | |
"end\n", | |
"\n", | |
"function mapseams(img)\n", | |
" w, h = size(img)\n", | |
" m = fill(Next(2, 0.0f0), (w, h))\n", | |
" for i=1:w\n", | |
" mapseams!(img, m, i, 1) # mark all min-seams\n", | |
" end\n", | |
" m\n", | |
"end" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 7, | |
"text": [ | |
"mapseams (generic function with 1 method)" | |
] | |
} | |
], | |
"prompt_number": 7 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"given a matrix of Next values, figure out a seam starting at (x, 1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"function get_seam(seammap, x)\n", | |
" w, h = size(seammap)\n", | |
"\n", | |
" path = Array(Int, h)\n", | |
" for y = 1:h\n", | |
" path[y] = x\n", | |
" x += seammap[x, y].direction\n", | |
" end\n", | |
" path\n", | |
"end" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 8, | |
"text": [ | |
"get_seam (generic function with 1 method)" | |
] | |
} | |
], | |
"prompt_number": 8 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"using Color\n", | |
"\n", | |
"# For inspection, mark a seam\n", | |
"\n", | |
"function markseam(img, seam, color=RGB(1,0,0))\n", | |
" img\u2032 = copy(img)\n", | |
" w, h = size(img)\n", | |
" for j=1:length(seam)\n", | |
" img\u2032[seam[j], j]=color\n", | |
" end\n", | |
" img\u2032\n", | |
"end" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 9, | |
"text": [ | |
"markseam (generic function with 2 methods)" | |
] | |
} | |
], | |
"prompt_number": 9 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"test_img = imread(\"bangalore-dancers-s2.jpg\")\n", | |
"@manipulate for i=1:width(test_img)\n", | |
" markseam(test_img, get_seam(mapseams(test_img), i))\n", | |
"end" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": [], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"Slider{Int64}([Input{Int64}] 50,\"i\",50,1:100)" | |
] | |
}, | |
{ | |
"metadata": { | |
"comm_id": "0e4f9764-c5ad-43fb-a4f5-882b03441ba7", | |
"reactive": true | |
}, | |
"output_type": "pyout", | |
"png": "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", | |
"prompt_number": 10, | |
"text": [ | |
"RGB Image with:\n", | |
" data: 100x75 Array{RGB{UfixedBase{Uint8,8}},2}\n", | |
" properties:\n", | |
" IMcs: sRGB\n", | |
" spatialorder: x y\n", | |
" pixelspacing: 1 1" | |
] | |
} | |
], | |
"prompt_number": 10 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# get the min-seam\n", | |
"function minseam(seammap)\n", | |
" _, idx = findmin([pos.energy for pos in seammap[:, 1]])\n", | |
" get_seam(seammap, idx)\n", | |
"end" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 11, | |
"text": [ | |
"minseam (generic function with 1 method)" | |
] | |
} | |
], | |
"prompt_number": 11 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"function carve(img, seam) # Carve out a seam\n", | |
" w, h = size(img)\n", | |
" img\u2032 = fill(RGB(0.0f0, 0.0f0, 0.0f0), w-1, h)\n", | |
"\n", | |
" for y=1:h\n", | |
" i=1\n", | |
" for x=1:w\n", | |
" if seam[y] == x\n", | |
" else\n", | |
" img\u2032[i, y] = img[x, y]\n", | |
" i += 1\n", | |
" end\n", | |
" end\n", | |
" end\n", | |
" Image(img\u2032, [\"spatialorder\" => [\"x\", \"y\"]]) # same spatial ordering as the original\n", | |
"end" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 14, | |
"text": [ | |
"carve (generic function with 1 method)" | |
] | |
} | |
], | |
"prompt_number": 14 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"img1 = carve(test_img, minseam(mapseams(test_img)))" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"png": "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", | |
"prompt_number": 15, | |
"text": [ | |
"RGB Image with:\n", | |
" data: 99x75 Array{RGB{Float32},2}\n", | |
" properties:\n", | |
" spatialorder: x y" | |
] | |
} | |
], | |
"prompt_number": 15 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"size(img1)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 16, | |
"text": [ | |
"(99,75)" | |
] | |
} | |
], | |
"prompt_number": 16 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Woot! That seems to have worked. But does it really? How does it look while it's at it?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# IJulia's image widget assumes width does not change, so we will\n", | |
"# define a type and our own way of showing the image.\n", | |
"immutable ImgFrame\n", | |
" img::Image\n", | |
"end\n", | |
"\n", | |
"Base.writemime(io::IO, m::MIME\"text/html\", frame::ImgFrame) = \n", | |
"write(io, \"\"\"<img src=\"data:image/png;base64,$(stringmime(MIME(\"image/png\"), frame.img))\"/>\"\"\")" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 17, | |
"text": [ | |
"writemime (generic function with 27 methods)" | |
] | |
} | |
], | |
"prompt_number": 17 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"@manipulate for n=0:99, show_next=true, file in filenames\n", | |
" img = imread(file)\n", | |
" for i=1:n\n", | |
" img = carve(img, minseam(mapseams(img)))\n", | |
" end\n", | |
" ImgFrame(show_next ? markseam(img, minseam(mapseams(img))) : img)\n", | |
"end" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": [], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"Slider{Int64}([Input{Int64}] 49,\"n\",49,0:99)" | |
] | |
}, | |
{ | |
"html": [], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"Checkbox([Input{Bool}] true,\"show_next\",true)" | |
] | |
}, | |
{ | |
"html": [], | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": [ | |
"Options{:ToggleButtons,ASCIIString}([Input{ASCIIString}] belur-carving-s2.jpg,\"file\",\"belur-carving-s2.jpg\",\"belur-carving-s2.jpg\",[\"belur-carving-s2.jpg\"=>\"belur-carving-s2.jpg\",\"bangalore-dancers-s2.jpg\"=>\"bangalore-dancers-s2.jpg\",\"british-museum-s2.jpg\"=>\"british-museum-s2.jpg\"])" | |
] | |
}, | |
{ | |
"html": [ | |
"<img src=\"data:image/png;base64,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\"/>" | |
], | |
"metadata": { | |
"comm_id": "10ed82be-a19a-4366-98a0-2c3dc5065618", | |
"reactive": true | |
}, | |
"output_type": "pyout", | |
"prompt_number": 21, | |
"text": [ | |
"ImgFrame(RGB Image with:\n", | |
" data: 51x75 Array{RGB{Float32},2}\n", | |
" properties:\n", | |
" spatialorder: x y)" | |
] | |
} | |
], | |
"prompt_number": 21 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [] | |
} | |
], | |
"metadata": {} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment