Files
uiuc-ece391-mp3/helpers/aqua.ipynb
2018-10-25 21:06:14 -05:00

189 lines
13 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from PIL import Image\n",
"from PIL import ImageEnhance\n",
"import numpy as np\n",
"\n",
"width = 40\n",
"height = 20"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.Image.Image image mode=RGB size=200x200 at 0x7F24D5B599E8>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"img = Image.open('aqua.jpg')\n",
"img = img.resize((width, height))\n",
"img.resize((200, 200))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"colors = [\n",
" (0,0,0), (0,0,170), (0,170,0), (0,170,170),\n",
" (170,0,0), (170,0,170), (170,85,0), (170,170,170),\n",
" (85,85,85), (85,85,255), (85,255,85), (85,255,255),\n",
" (255,85,85), (255,85,255), (255,255,85), (255,255,255),\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAFT0lEQVR4nO3dwXLqOBCGUTyVVzQPiR6Su42amqYU+U9yZ87ZUUmwIV950Qj5eD6fN77kOI7PD8/cO3m/Tw8fj9SBVvQn8c83nQX/M8IiQlhECIsIYREhLCKERYSwiBAWER8/fQJ/s++agI8xPj/sB/z3eUw/zvPzw3N+uKN88FA+wnHFIkJYRAiLCGERISwihEWEsIgQFhHCIuKw5r1R1pqPc/zLL+4faXr0fF42H2+Ps2WYvPP9hEWEsIgQFhHCIkJYRAiLCGERISwifunkvazyHtet1P4x88z7vM071TymF3gc8yL3jf/R0qi9vO39Anm7zfADhEWEsIgQFhHCIkJYRAiLCGERISwifmzyfuHi619qY3P2pQl4zs5mOq5YRAiLCGERISwihEWEsIgQFhHCIkJYRFw5ef+pYXoZEP8VM/2d2fo5b/My5v9gvwnMt3HFIkJYRAiLCGERISwihEWEsIgQFhHCImJt8n7fWMfdO+/z7iu3aRJ9nw/0mE/jvnEa5bjFeLRvTpnx77wZFz7VmwNNR3rEbhLrikWEsIgQFhHCIkJYRAiLCGERISwihEXEm8n7hevH64i3HeKPdhD/8lzT46VzLkP8Xhnxn/O69fKKxq/cQH/JzvJ5VywihEWEsIgQFhHCIkJYRAiLCGERISwiPsrjnVXtZYpdNlS5Pcv0vHvml1F798tlQPzYGXnXA80rxMsLnLeIOcsLnD88eLN8fsnK/6i8OeWX3+1yM3+ksbJe3hWLCGERISwihEWEsIgQFhHCIkJYRAiLiLrm/VjZf7zfImZnL5rjmE7j+WwHxP269X4b+K2TXFkSXnbIKacV215mtO9keefGuGyPeFcsIoRFhLCIEBYRwiJCWEQIiwhhESEsIrZ2m3lsbE9extbn2Z3G4nj83jx6Yz7S4km278Y85D7KevmVO6wuKd88eMYOVLhiESEsIoRFhLCIEBYRwiJCWEQIiwhhEfFRdiM520F8vR/pxg4qb5axb91ytF1Oft1NYs9z3k6nP8n5h/X7Aa26b08xv6LyH8zN9HuuWEQIiwhhESEsIoRFhLCIEBYRwiJCWERsrXk/V6b2NN58t6DsVLPxaUFsV5vKFYsIYREhLCKERYSwiBAWEcIiQlhECIuIeofVJaOM2su279fdU7TeJnT2snP70k1EdxbXf93SFjj9Iv6lrfm/jSsWEcIiQlhECIsIYREhLCKERYSwiBAWEW/WvPc3Ea3j47LtSRkBj/mnG3P5ce8G8beyNUs7iL7w44Ela5vPrzxZvXfr2lNdxhWLCGERISwihEWEsIgQFhHCIkJYRAiLiDeT96JfH15+Oo5pBL60RUrZ2fyxsb/KL9Hvpz/quvWFHeQvHeJfxhWLCGERISwihEWEsIgQFhHCIkJYRAiLiLXJe/3jC/d5n9fL/wdG7UX//YD+9S7N1ssHHud8J9vRfonhQq5YRAiLCGERISwihEWEsIgQFhHCIkJYRGxN3utzlYXq80/HmLd9qXuXt+vp5zn1Me9j87JCvDtu3QNnfuaxskn6s/3lfm/68inFfBa3UV7R/NMyTN+R+3zDFYsIYREhLCKERYSwiBAWEcIiQlhECIuIrcl7vxb7ZQeVsvh6+umznybPk+l7u81NmZ738/FjzMv2y0mO7m/rM5fx+cqy/f7bA+WdLF7O+es3XL1wEO+KRYSwiBAWEcIiQlhECIsIYREhLCKERcTa5P3C7WWWtj2pm6SXWfN8T9XFm6bOa97v7Yw7djvWS/ftaR+vfB6wM4h3xSJCWEQIiwhhESEsIoRFhLCIEBYRwiLiD1+gclm7vk3pAAAAAElFTkSuQmCC\n",
"text/plain": [
"<PIL.Image.Image image mode=RGB size=200x200 at 0x7F24D5918748>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"img = Image.open('aqua.jpg')\n",
"img = img.resize((width, height))\n",
"converter = ImageEnhance.Color(img)\n",
"img = converter.enhance(8)\n",
"data = []\n",
"for x in range(width):\n",
" for y in range(height):\n",
" min_distance = 255 ** 2 * 3\n",
" min_color = 0\n",
" for i, color in enumerate(colors):\n",
" new_distance = np.sum((np.array(img.getpixel((x, y))) - np.array(color)) ** 2)\n",
" if new_distance < min_distance:\n",
" min_color = i\n",
" min_distance = new_distance\n",
" img.putpixel((x, y), colors[min_color])\n",
" data.append(min_color)\n",
"img.resize((200, 200))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAACgAAAAUCAIAAABwJOjsAAAB1UlEQVR4nKVV0ZLjMAgTO/eL0keKj+Qe7Dgkcbp7t5pOp7UdhAQ4gV+DVfclCfbb+YwA8PVb2h1BZhowACkzt8/FfzOSlXwEFar4WLumFQHgz+fotpP3QCc32pZABIsRqmb+Ys1MtlCvijeV+4BW1BtBx9C6J37j88OxTdxGyYis6kw3nM1F8sZKhSUAlnRdp46IbYPk+ptVQwartgbM52+UoyFhp4IgDMCLwkcaspkJKX9Wl27A18y0BWUEMGtGEDbgjBgTMitpwzMDFk8DFo7kMqJNlK/q7eGJiSKrAfD8RRZZxccBrANkTW/bZ6RK3i356tnRXM0ZEVIzwz4bTGoHatV5M9aYFmU+LBk8U+4FbN99mUsrWbb7xlRpz0pN0RtcmosR/za+DwztltSu0u1QXe7qrMpHm2RERsSlR/Yjfa4aBt5u6YGTpqoEQCKJFH1Kn9kkxhXZt7bEh1gJxoviE6ukgBfIR41fYKBqlJyrRz7UeEN/fn7MWtfzfZa+aa4TtoFMwjAEGFKQZALIJElI65VV5DKTVRKSCYHXl+P3bo9h4PXqYJEkjsmBweKYmT5gddzPY2uF2hoeN+Ke4wiUESQT2XpKqcSuy+I2kMK6fW+6/wIaqiY01hDlXwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<PIL.Image.Image image mode=RGB size=40x20 at 0x7F24D58F7320>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def fill(img, x, y):\n",
" if x < 0 or y < 0 or x >= width or y >= height:\n",
" return img\n",
" if img.getpixel((x, y)) == (255, 255, 255):\n",
" img.putpixel((x, y), (0, 0, 0))\n",
" data[x * height + y] = 0\n",
" fill(img, x+1, y)\n",
" fill(img, x-1, y)\n",
" fill(img, x, y+1)\n",
" fill(img, x, y-1)\n",
" return img\n",
"\n",
"fill(img, 0, 0)\n",
"fill(img, 0, height - 1)\n",
"fill(img, width - 1, 0)\n",
"fill(img, width - 1, height - 1)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,3,0,0,0,0,0,0,0,0,0,0,\n",
"0,0,0,0,0,0,0,11,11,11,11,11,11,11,0,0,0,0,0,0,0,0,0,0,0,0,8,11,11,11,11,6,11,11,15,11,0,0,0,0,\n",
"0,0,0,0,0,0,11,11,11,6,14,15,4,11,11,15,0,0,11,11,0,0,0,0,0,11,11,11,12,12,15,15,15,6,8,11,11,3,11,11,\n",
"0,0,0,0,0,11,11,11,4,15,15,15,15,15,7,1,11,7,3,11,0,0,0,0,0,11,11,15,14,15,15,15,15,15,6,7,11,9,11,11,\n",
"0,0,0,0,11,11,11,12,15,15,0,14,15,15,15,7,11,11,1,0,0,0,0,0,11,11,6,15,15,15,9,15,15,15,15,7,8,14,15,15,\n",
"0,0,0,7,11,11,12,6,12,1,9,14,15,15,15,8,15,15,15,15,0,0,0,11,11,11,11,12,15,15,15,15,15,4,15,15,15,12,12,4,\n",
"0,0,0,11,11,11,12,14,15,15,15,15,15,4,6,15,15,3,10,12,0,0,0,11,11,15,11,15,4,12,15,15,15,0,6,15,15,10,8,6,\n",
"0,0,0,11,11,11,11,11,15,12,14,15,15,7,4,15,15,10,3,15,0,0,0,11,11,11,11,11,15,14,12,15,15,15,6,15,15,3,15,15,\n",
"0,0,0,11,11,11,11,11,15,12,12,12,15,15,6,15,15,11,15,15,0,0,0,11,11,11,6,12,12,15,12,15,15,14,15,15,15,8,2,14,\n",
"0,0,0,11,11,11,6,12,15,15,15,15,15,15,15,15,15,3,10,6,0,0,9,11,11,11,11,12,14,15,0,0,15,15,15,15,15,3,3,6,\n",
"0,0,3,11,11,11,11,11,12,15,9,9,15,15,15,15,15,3,3,15,0,3,3,11,11,11,9,7,7,0,9,7,15,15,15,15,15,15,15,15,\n",
"11,11,3,11,11,11,11,4,14,15,14,15,15,15,15,15,15,15,12,15,11,11,3,11,8,11,11,11,6,15,15,15,15,15,15,15,15,4,15,15,\n",
"11,11,3,9,11,11,11,11,11,12,12,14,15,15,15,4,11,4,15,15,11,11,3,6,11,3,11,11,11,9,3,11,15,11,11,15,8,15,15,15,\n",
"11,11,1,14,11,11,9,11,11,11,11,11,11,11,11,7,15,9,0,0,11,11,15,0,3,11,11,11,11,11,11,11,11,11,11,14,15,3,11,11,\n",
"8,0,15,15,11,11,11,11,11,11,11,3,12,14,15,15,11,1,3,11,11,15,15,15,11,4,11,11,8,11,11,3,11,15,15,15,11,11,3,11,\n",
"11,15,15,15,11,11,11,11,11,11,11,0,11,3,14,11,11,11,11,11,11,8,15,15,11,0,11,11,11,11,11,11,11,11,11,11,1,11,3,9,\n",
"11,3,15,11,11,0,11,11,0,1,3,11,11,11,11,11,11,11,11,8,11,11,11,11,11,0,8,11,3,0,0,0,0,0,0,0,0,11,11,11,\n",
"11,11,11,11,11,0,0,11,11,9,0,0,0,0,0,0,0,0,11,11,11,11,11,3,11,0,0,11,11,0,0,0,0,0,0,0,0,0,0,11,\n",
"11,11,11,11,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,11,11,11,11,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,\n",
"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n"
]
}
],
"source": [
"for y in range(height):\n",
" for x in range(width):\n",
" print(data[y * width + x], end=',')\n",
" print('')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}