Created
December 23, 2018 23:47
-
-
Save ftnext/8b7e1a402453e06d391d0affb08d05bb to your computer and use it in GitHub Desktop.
20181223 #imas_hack
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
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"import matplotlib.pyplot as plt\n", | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from PIL import Image\n", | |
"from sklearn.cluster import KMeans" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"img_org = Image.open('images/b_6852edbc3d0730948a714ffe06c3bc7c-4.png')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(177, 171)" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"img_org.size" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# 元がRGBAだと思うが、念のためRGBAに変換して配列にする\n", | |
"img_org_pixels = list(img_org.convert('RGBA').getdata())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"30267" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"len(img_org_pixels)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(0, 0, 0, 0)" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"img_org_pixels[0]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"img_org_rgb = [pixels[0:3] for pixels in img_org_pixels]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"30267" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"len(img_org_rgb)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"img_org_mat = np.array(img_org_rgb)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(30267, 3)" | |
] | |
}, | |
"execution_count": 13, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"img_org_mat.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"model = KMeans(n_clusters=2, random_state=0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,\n", | |
" n_clusters=2, n_init=10, n_jobs=None, precompute_distances='auto',\n", | |
" random_state=0, tol=0.0001, verbose=0)" | |
] | |
}, | |
"execution_count": 15, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"model.fit(img_org_mat)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[ 7.97204175, 8.66844295, 8.04409081],\n", | |
" [160.78458474, 152.6538508 , 144.92920087]])" | |
] | |
}, | |
"execution_count": 16, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"model.cluster_centers_" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"Y = model.predict(img_org_mat)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([0, 0, 0, ..., 0, 0, 0], dtype=int32)" | |
] | |
}, | |
"execution_count": 18, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"Y" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(30267,)" | |
] | |
}, | |
"execution_count": 19, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"Y.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"centers = np.zeros(model.cluster_centers_.shape, dtype=np.uint8)\n", | |
"for i in range(model.cluster_centers_.shape[0]): # 今回は2行(クラスタ分の行数) \n", | |
" val = model.cluster_centers_[i]\n", | |
" for j in range(model.cluster_centers_.shape[1]):\n", | |
" centers[i][j] = int(val[j])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[ 7, 8, 8],\n", | |
" [160, 152, 144]], dtype=uint8)" | |
] | |
}, | |
"execution_count": 21, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"centers" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"img_cnv = np.empty((0, 4), dtype=np.uint8) # 0行4列の枠(Aの分)\n", | |
"for i in range(Y.shape[0]):\n", | |
" if img_org_pixels[i][3] > 0 : # シルエットの部分\n", | |
" rgba = np.append(centers[Y[i]], [255]).astype(np.uint8)\n", | |
" else:\n", | |
" rgba = np.append(centers[Y[i]], [0]).astype(np.uint8)\n", | |
" img_cnv = np.append(img_cnv, np.array([rgba]), axis=0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"width, height = img_org.size\n", | |
"# reshapeして渡す\n", | |
"img_cnv = img_cnv.reshape((height, width, 4)) # Y, X, チャネル数の順" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"cvt_img = Image.fromarray(img_cnv, mode='RGBA')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<PIL.Image.Image image mode=RGBA size=177x171 at 0x122328668>" | |
] | |
}, | |
"execution_count": 25, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# 肌の色とそれ以外に分けるの難しい\n", | |
"cvt_img" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# 原色に使う画素を絞る" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# 前景の画像のPixel\n", | |
"not_a0_pixels = [pixel for pixel in img_org_pixels if pixel[3] != 0]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"18586" | |
] | |
}, | |
"execution_count": 27, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"len(not_a0_pixels)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(164, 183, 164, 53)" | |
] | |
}, | |
"execution_count": 28, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"not_a0_pixels[0]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# aが0でないピクセルを原色処理の対象とする\n", | |
"img_org_rgb = [pixels[0:3] for pixels in not_a0_pixels]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"18586" | |
] | |
}, | |
"execution_count": 30, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"len(img_org_rgb)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"img_org_mat = np.array(img_org_rgb)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(18586, 3)" | |
] | |
}, | |
"execution_count": 32, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"img_org_mat.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"model = KMeans(n_clusters=2, random_state=0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,\n", | |
" n_clusters=2, n_init=10, n_jobs=None, precompute_distances='auto',\n", | |
" random_state=0, tol=0.0001, verbose=0)" | |
] | |
}, | |
"execution_count": 34, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"model.fit(img_org_mat)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[111.28940726, 105.68134738, 98.61354339],\n", | |
" [210.57968156, 202.0212766 , 194.22460194]])" | |
] | |
}, | |
"execution_count": 35, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"model.cluster_centers_" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"Y = model.predict(img_org_mat)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 37, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([1, 1, 1, ..., 0, 0, 0], dtype=int32)" | |
] | |
}, | |
"execution_count": 37, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"Y" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 38, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(18586,)" | |
] | |
}, | |
"execution_count": 38, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"Y.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 39, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"centers = np.zeros(model.cluster_centers_.shape, dtype=np.uint8)\n", | |
"for i in range(model.cluster_centers_.shape[0]): # 今回は2行(クラスタ分の行数) \n", | |
" val = model.cluster_centers_[i]\n", | |
" for j in range(model.cluster_centers_.shape[1]):\n", | |
" centers[i][j] = int(val[j])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 40, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[111, 105, 98],\n", | |
" [210, 202, 194]], dtype=uint8)" | |
] | |
}, | |
"execution_count": 40, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"centers" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 41, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"img_cnv = np.empty((0, 4), dtype=np.uint8) # 0行4列の枠(Aの分)\n", | |
"a0_index = 0\n", | |
"length = len(img_org_pixels)\n", | |
"for i in range(length):\n", | |
" if img_org_pixels[i][3] > 0: # シルエットの部分 (ここが5のノートでバグか)\n", | |
" rgba = np.append(centers[Y[a0_index]], [255]).astype(np.uint8)\n", | |
" a0_index += 1\n", | |
" else:\n", | |
" rgba = np.array(list(img_org_pixels[i][0:3])+[0]).astype(np.uint8)\n", | |
" img_cnv = np.append(img_cnv, np.array([rgba]), axis=0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 42, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(30267, 4)" | |
] | |
}, | |
"execution_count": 42, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"img_cnv.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 43, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# reshapeして渡す\n", | |
"img_cnv = img_cnv.reshape((height, width, 4)) # Y, X, チャネル数の順" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 44, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(171, 177, 4)" | |
] | |
}, | |
"execution_count": 44, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"img_cnv.shape" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 45, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<PIL.Image.Image image mode=RGBA size=177x171 at 0x122333748>" | |
] | |
}, | |
"execution_count": 45, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# 背景と同化している感じがあるが、さきほどよりはGood\n", | |
"cvt_img = Image.fromarray(img_cnv)\n", | |
"cvt_img" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 46, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(177, 171)" | |
] | |
}, | |
"execution_count": 46, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"cvt_img.size" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 47, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"cvt_img.save('images/serika_transparent_pillow_20181223.png')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# モザイク処理を実行" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 48, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"DOT_AREA_ONE_SIDE = 5" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 49, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"image_color = (237, 144, 186) # 星梨花 #ed90ba\n", | |
"white_color = (255, 255, 255)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 52, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"color1 = tuple(centers[0])\n", | |
"color2 = tuple(centers[1])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 54, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(177, 171)" | |
] | |
}, | |
"execution_count": 54, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"icon_im = Image.open('images/serika_transparent_pillow_20181223.png')\n", | |
"icon_im.size" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 55, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(175, 170)" | |
] | |
}, | |
"execution_count": 55, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# 余分なピクセルを切り取り、175×170にする\n", | |
"icon_im = icon_im.crop((1, 1, 176, 171))\n", | |
"icon_im.size" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 56, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"icon_im_width, icon_im_height = icon_im.size\n", | |
"dot_icon_im = icon_im.copy()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 57, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"for left in range(0, icon_im_width, DOT_AREA_ONE_SIDE):\n", | |
" for top in range(0, icon_im_height, DOT_AREA_ONE_SIDE):\n", | |
" color1_count = 0\n", | |
" color2_count = 0\n", | |
" #平均色の計算\n", | |
" for x in range(left, left+DOT_AREA_ONE_SIDE):\n", | |
" for y in range(top, top+DOT_AREA_ONE_SIDE):\n", | |
" rgba = icon_im.getpixel((x, y))\n", | |
" if rgba[3] == 0:\n", | |
" continue\n", | |
" else:\n", | |
" if tuple(rgba[0:3]) == color1:\n", | |
" color1_count += 1\n", | |
" elif tuple(rgba[0:3]) == color2:\n", | |
" color2_count += 2\n", | |
" else:\n", | |
" print(\"想定外: aが0でないが、色が2つ分類されていない\")\n", | |
" if color1_count > color2_count:\n", | |
" area_color = tuple(list(image_color)+[255])\n", | |
" elif color1_count < color2_count:\n", | |
" area_color = tuple(list(white_color)+[255])\n", | |
" else:\n", | |
" area_color = (255, 255, 255, 0)\n", | |
" average_color_im = Image.new('RGBA',\n", | |
" (DOT_AREA_ONE_SIDE, DOT_AREA_ONE_SIDE),\n", | |
" area_color) # a=0だと透明で何も見えない\n", | |
" dot_icon_im.paste(average_color_im, (left, top))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 58, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAK8AAACqCAYAAADbXx/GAAAD8UlEQVR4nO3d0W3bMBQFULnwBNkp82SVZp1mpnYF9yd/ogDGpEle6ZzPIolV6eLBF6Sk2+Px2CDRr9kHAM8SXmIJL7GEl1j3bdtKje02+kAGmtJQ/31+7f7t7eP9zOf55UxeYgkvsYSXWMJLrNujfolt9XLRtYiVCtYsil2ZyUss4SWW8BJLeIl1n30AT3q6nK1UxGhj8hJLeIklvMQSXmIdFbZTrOicvJx1La2Jq3gmL7GEl1jCSyzhJdZtpYeO/Pv8qjqYt4/32r/XdDzsHZz7KWXP5CWW8BJLeIklvMSatiWytpz94O89/bulEqLslR2cl921HLFiZ/ISS3iJJbzEEl5iTStspS/0vUtcrd7lTAEcw+QllvASS3iJJbzEGlLYZhWxEWq3Z15tG2fpmvdedTN5iSW8xBJeYgkvsV5R2Kq+qLeUuBGlprZg1Tp40EfXz7gak5dYwkss4SWW8BKre2GrvcdpltW3K65+fCsxeYklvMQSXmIJL7GaCtuZtzr2ZjWtP5OXWMJLLOEllvAS6yeP9a/6wZVWgxJL0krnrzf3sME34SWW8BJLeIlVvcJWWyRW2tLnvrFzM3mJJbzEEl5iCS+xbo/CEtuZV3lKZpW4C55nK2ywbcJLMOEllvAS6/b395+4+9BmvcNt9dW51QugwgbfhJdYwkss4SXWtBdnj9Dy7rPVy1lJyzGPKHu9381m8hJLeIklvMQSXmKdurDVFrHEctZisZW40spoqcTtfs7kJZbwEkt4iSW8xIrcElnrakWsxWIlbqd0LU1eYgkvsYSXWMJLrOoVtpWe/liinF2PyUss4SWW8BJLeIlVLGy15Wf1Eke9EdfSQ0fgm/ASS3iJJbzEKhY2pYtWvctZiclLLOEllvASS3iJ1fTQkd7bEBXFtbSsuvV+ImSJyUss4SWW8BJLeIlVfHH2SlpKnPva+ltpm6TJSyzhJZbwEkt4iTXzsf5VX9TfPt53hdJK3Hm0rMSZvMQSXmIJL7GEl1ijVtiq3qtV6ywvuj6LEQW6VOJMXmIJL7GEl1jCS6xRK2wvXyVT4spqz3PiuTJ5iSW8xBJeYgkvse4tRaf2d3vfh3aWLZEr/T9GXMsS97BxScJLLOEllvAS6xWP9d99AW9ZvSnd47SSQdsBp3xuY9H2WH84IrzEEl5iCS+xjl6c/fIv2yXK2bzPnXXNa5WyYfISS3iJJbzEEl5i3Vf/oj7LStsVa13tWpq8xBJeYgkvsYSXWDMf6z/FrCJ2tTI1gslLLOEllvASS3iJNa2wjdj+ePAgDcXpJExeYgkvsYSXWMJLrNuY17DVqS1xShfbZvISTHiJJbzEEl5i/Qd7LR+vYHHCPQAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<PIL.Image.Image image mode=RGBA size=175x170 at 0x12232E358>" | |
] | |
}, | |
"execution_count": 58, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"dot_icon_im" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 59, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"dot_icon_im.save('images/silhouette_dot_5x5_serika.png')" | |
] | |
} | |
], | |
"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.6.6" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment