Skip to content

Instantly share code, notes, and snippets.

@ftnext
Created December 23, 2018 23:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ftnext/8b7e1a402453e06d391d0affb08d05bb to your computer and use it in GitHub Desktop.
Save ftnext/8b7e1a402453e06d391d0affb08d05bb to your computer and use it in GitHub Desktop.
20181223 #imas_hack
Display the source blob
Display the rendered blob
Raw
{
"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": "iVBORw0KGgoAAAANSUhEUgAAALEAAACrCAYAAAApZH04AAAMyklEQVR4nO2dS3YcKwyG1T5ej4cZZi1+jDzyWjzyyI+1eOihN9R3kKuExrwEEkiUvnNyEjvVXRT8CCEEBeA4juM4juM4juM4jrOU76/P8+oyWMTrTQ8nbIybX79Pqwujie+vz/Pr+wcAADzc3RavfX3/gIe7W8DrQ/CzXr9ynGKLcuTK5rSuKUEjzy9vh61jCVzEIOsa5MTsQubjQsRHEvCocENx1tyN+HrEhczDD0uM7ChobouLvnD8uxQ5nxnAxTyKi7iB3ISt5PdScSH3kxUxwF5CpgqYU6CtuJD72N4SU8S7QrgpXMw0trbErQLWIt4QF3I7V6sLIIVlAQMAPD3e+4pgI1uKuEXAr+8fagWMuJDbSIpYe+OWaBWwsw8/RIwNbLGhWyyXtedya1znKp68YfDe0sTi++vz/PR4f25ZOXP24wSQHoItRSZaBGzNAsdYMiqzuUIBh41sqcF3dCFSuFuR5xr/gZbMUoOnOmCMpefpwbMQAa5TD22l19cEupuAU25TnE2H1xxJzOYfNOcPaxJwWD6OctWSj3Lzg/gzu/jZph4CRwisfPy5NR1yFdwipt6z5b6WBa16xe7p8f4cujZY0Zo2afYmxEtDXZHEurbiSoaoFnGO1/ePv0JeaYUpcelVy9yl++bKH4v5++vzrMlwxKgbQnKWIOVCpHZWAMwfsrW5Lz1Qkvy1TRzNWOJY3FLCebi7JVnYXaDUJ46EWlwPVSKmDlmSVviIQqaA9axByKpETBVg6bCS1O9rVjb+v5al7B1cCeuoEnENjl5PHTadOqut8XX9Er1wuxMu2ksoE9enx/vzqlizKUtcomVod5H20To/WGWRtxFxjRUCtj45tNLpDyNiZwzN1thFLMwO1rj1iFtktpBVibh3oUH7sGddyAC661iNiPFQa42V1SPCFZlr0mh9juUixmQTrRVEIZWMhPkdqY6wg4XOMdOlWCpiTGjPNbClPIbSM9SuccZYstgR9tKcBbZsmVuWtmMrbfl5VzPdEq9eotRCvBq2o0We1dZTLbFFAVPFRbk+l3DkVpnG8oldDHW3hAZay4wuRPhn5PucP0wTce2UHotWqHXiWRKs1rAiFzNG3ykiLiW7WxMvNWoSPxd+TvsObUtMs8Qp/2/lrLwW+kpdQx3maycTxd/Zc5aEM9knjmfiHALu+Y6W2C2HaFLfQ9mN0vr/2pF2KcRFjA8gIWBOViyujHZA5w+iIbaUgDWJV9tQnurg8e801Z8WxCxxPIRoEbCmc9ta/HKnzhSf2KKAc1EErvtKfk4jkn6xiIjDAmsRcIqWc425z7Fo6RyUqIUjIOJYwBaY7fNaqRcriLsTWq2I1nLFWCnnSlhFLO1GjFqwlIvg1tE+bCKeceCfxDlrWi3djjkVUpM7EXdCs1Ur5e9qCXntJl5pTB9j1UvrvjfNndH5B4slDrPUtPmYWsrhyDEsYgu7NVoTcRybDIs4F4VYvZSby0Nwy7wfQyLGA08QDQIpJc+Ev9dQ1hQ+QtBRt8cuB1V4cYhK02jh8DJ0KHIqUy1Gg1Bil8et8DokDuLutsQWJnRILI4dFxI0u0iI1EnyXSIuCbg2hK8kd1aahnKOlkHLc6yA1SfWvPvAV+D2RWxiN7vhnl/eTiPDlWR5ax3oCCKXfCmNmehEDo4DTMJrqIx+5xEELA25d2ib0GlI+cRcjNbfh/9/FEQtsfY3qNeoCaX3OynEx7W2nHQZX2MhuqCVEwo49dZ0bVY3RdjDc+V9fnk79T6LlLCOZIUBhC3x6/uHSQG3TuTwmt5K5BbbzucRr8LkxI4iyJbOWBvKuWKwra6PuxY0uofZFTzc3SZHDaT0LKUJYM/RWr2HC5ZSQrmEW3sOrIvZxymoWrGzSCii3Mpdz/e1XlvbScJpeVut/S6Y2p5UssI1ejeHxtYDrX2rRW1xIWYKaqV4nx7vzxLW2JSIa1CjEFihqc9QKzvXSVaIJu44tcMSpVyKVP1KCHkrEbdSajiOCl49VMf313qcLhfb+cStIny4uwXqQk/OlbBC3HmlRY1vi039nvM+h7TEIeGEL/S5U+LewZKFQtZ82COFw4sY4O/CCQDUw3TaoSzD7yBggA3dCYC0S9HSYNbdBYC14TXuRagWvr8+z6ZEPPLgqckN/ht9N18pswW6fId0J1Jb+I+GdX84nLOYssQj5FbljihgCUYTrSjEk+7DiDjGXYf1HRjdQwx1toQ74zdyARhLAEJae3vq2VY3HDejq4NcLkVueZ7zO0ORh1GYYZ/Ykm+1m4ABxp9Jc/vVDm7Hn4fdiRUV0NPLdxSw84cuEVsUhFZrowGJ9pSc4OF8Bv+YndhRrbHmYXNHJOZa8WT85tfv082v3yezIqag7fR6h07cdmGey1XqghqWLNqMvXMrkXijFAfc7kT4nPHmCFJ0IjUkrxymSwnWtZijxHkVK9D6DD2bE2o83N2eU7t7TnHsLfFB1SfZ5CoAcyEcGr1tSYkTc1vpJp9Y0x6xmFRlfX99uoCVInbINqdvaF080n4y1/kVUvS2X4v7ILZln/vUxhW+Jlc4Z8bpPBzfjS6e5klpLFhzR7tqrtwSlpKCJMvK9b2zMtvYRLy68bmtsUNnVTIZScSa3nGRguOY2lTIUOvzSrLaKFG4SMW0vjQrUfE9Pr7kZ2bPOXr0MCMxPuTKUo+bTa9gKJ+hjmyz28uCPi7cidqpkdqxOIqE2Vi7MNs3robYAGyKgwNu/7j3s6vnIdo72HZZbBIvoQnfzyfld9fKoF1IMTOt8fQt+6UjUbXCIaDcc1p4fu2IbRSlTm5W3r8XqmWOVwQtvb+jp41qJ/tzwWaJKed/YQgGY7oWjx7tbdTV/m0PI77899dnMn2SkyWvxko9FAqas4FnW+Oew/xS12vKdY6frxfJ2HGziLkr9ebX71PcS7mFvGJRYOSemtyLVEcabRcpIRdFLF2Z0hZZgxgskhsJONpELJ8YibdCrwCFvZsASwLQ4COHvrpk3UsEEk6r3+ucc/o5LLKVjrDSjaDeW+rYqxFERVyalZbeKR1f01txmkVc8jm1l5sTDjEnRcxZmaPhle+vz/OOIraKhOszKuRTaO1mNjpF3L1CtiBiC9YX4J8+pPz3ESGfVr6nolXIvW6FBWGEaC8vos2luFoViZixHGmFsP417Z7RUIYWlkUnqCLuscZaLRtlF0cIx0IKx3elvm+UEWu8LBWT2nl2iR9TO2HKSvegPXtwJH48xRJzuQ4Ua6xR7GG5a+WrrZr1PF8uD6K3rrREKsTyid3nvSQU30gnHBGhxo4dUzokMkeTOyE99IRvzymNDFY7xmj95Q56DAXdeo+UJdcWh6e6FklLHD9oa2FHRGZVoDUkBBySEnKpvSxYYwCaRU5aYkrYDStPm4A1TFwkowsxo4lb2qwxQLtFJvnEKT8s+PvvDSWtqgZx5shNxkYOUuHa35crl+b6bKUYnRiZwXIIOT6dCBPpLcSKtezcSC0Xl/xhTZEKgLZoxQ9LzBF6AUjHgSnCTr2IrzeW2NqAqWtG7zfyHT0WHKAeE5bamLtqAeQagB6/bL1WAs5EII07opGUEHMdUPtCRgssCUBIrsJbg+zh8JXbYBgWWPqQjdkdLRcOo362lGssLVLJCWgIV2L8dVwpsVipP6eI79HzIkUA6PKJe+EczimfrX2XZiu7QsAA/0/sar5hzQpQXBAKqQedNbHr3bbTmtjTutjAsV2+h54EpVa4N4teA+TFiZVdChulrDgHs8+4jekZtikdhmrpNYTDOO4v0a7XVIvTu5V7tSh7aRVb6ZoRf3b2jpvwvtxIaeAixFaKGZYmajm4C93jD4/4tgC84bZRYWiwxj1IG7C/Is65E6WfQ2ZY2t4G7Bm6e5kZRdDMzJF3OBXTgpsgMRzHK2G5KA/nvbSzSgtdIl5R2NlH6Kfi3alrUv+mYs1qYwrA6nIgzSK2YHEl0BanXSX4ULjPL2/T718iK+KjirbEagHPIlxcwt9pEy7y9Hh/vhCxCzePhIApvu7MLDGtgs1xbUG4q163GrJq5YwLC+1MBXUx/cUzlkhZSm6fVLpT7CjeGPUiXm2FtVje1sy/I4gW4LIO1Iv4yFAFeRQBx6h+GeNqK7ySkiAzk7FDChhAuYiPSosgw2uOLGAAdyfU0CvEIwo4HqFVi3jmNqbZcIjviAJOoVrEyIq8CW5ccHKYELE0LSmmPR3JhSvD88vbxQZn9ZU8aoV7dqKUxFcrjwt3DmZEzLWzuWWVjSK+nuNHHV7Ui3imD+xitMvhcydcvPugbrFjhhV2Ae+FqsaUFrCLdz9+JMXviot3b1Q1LocldsEeD3UNThGyC9YBUChigLyQXbSO4ziO4ziO4zg/+Q+NFXxyuW+AzAAAAABJRU5ErkJggg==\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