チャイムノート

メルストのキャラでモザイクアートを作りたい![python]

 f:id:chime-n:20190707143420j:plain

 

唐突ですがモザイクアートを作ってみたくなりました.

ただ,写真とイラストが混ざったような系統が違う画像を使うことにしっくりこなかったので,統一感のある画像でやりたいと思いました.

よって,今一番人気のあるアプリ(当社調べ)であるメルストのキャラ画像を使ってモザイクアートを作っていきます.

 

先にこれを書いておくぞ!

=====================
当ページは、Happy Elements株式会社「メルクストーリア」の画像を利用しております。
該当画像の転載・配布等は禁止しております。
©Happy Elements K.K
=====================

 

 

方針

モザイクアートを作るにはいろんな色の画像が必要になります.

メルストというアプリにはキャラクターがたくさんいるので多くの色を表すことができそうだったのですが,画像を集めるのが面倒すぎました.

一枚一枚スクショして正方形に切り取る作業をやる元気も若さもありません.

そのため,メルストの5属性から一人ずつ選んで,5色のモザイクアートを作ることにしました!

以下,代表選手紹介です.

 

火属性代表:ラヴィオ

f:id:chime-n:20190707131302j:plain

イケメン団長.

髪が赤いためモザイクアートの素材としても優秀.

 

水属性代表:ゲルトルート 

f:id:chime-n:20190707131324j:plain

ごろにゃー王女様.

お菓子の国の王女様の中で唯一の星4だが立ち絵がある.フランシールにもある.

 

風属性代表:こひばり 

f:id:chime-n:20190707131334j:plain

ジャパニーズニンジャ.

緑髪は不人気なことが多いが例外もいる.

 

光属性代表:ミシェリア様

f:id:chime-n:20190707131530j:plain

美しき天使.

公式人気ランキング第2位の美しさは伊達ではない.

 

闇属性代表:ロロきゅん

f:id:chime-n:20190707131547j:plain

かわいい.だが男だ.

メルスト恒例性別詐欺の筆頭格.

 

とりあえず好きなキャラを選びました.

この五枚をそれぞれ    黄(白)  とします.

黄と白は同じ画像を使います.

元画像の各ピクセル値と近い色に相当する画像をつなぎ合わせてつくります.

 

コード

こんな感じになりました.

import cv2
import numpy as np


class MosaicArt:
def __init__(self, base, color_list, size=None):
self.base = cv2.imread(base)
if size != None:
self._resize_img(size)
self.color_img = self._read_img(color_list)

def _resize_img(self, size):
self.base = cv2.resize(self.base, size)

def _read_img(self, color_list):
color_img = []
for color in color_list:
color_img.append(cv2.imread(color))
return color_img

def define_color(self, H_type):
hsv = cv2.cvtColor(self.base, cv2.COLOR_BGR2HSV)
gray = cv2.cvtColor(self.base, cv2.COLOR_BGR2GRAY)
H = hsv[:, :, 0]
div_H = 180/H_type/2
for i in range(H_type):
if i == 0:
H_label = np.where((H <= div_H) | (H > div_H*(H_type*2-1)),
i,
H)
else:
H_label = np.where((H_label > div_H*(2*i-1)) &
(H_label <= div_H*(2*i+1)),
i,
H_label)
x = 50
black_index = gray < x
white_index = gray > 255-x
H_label[black_index] = H_type
H_label[white_index] = H_type+1
return H_label

def connect_image(self, H_label):
for y in range(len(self.base)):
for x in range(len(self.base[0])):
if x == 0:
x_img = self.color_img[H_label[y][x]]
else:
x_img = cv2.hconcat([x_img, self.color_img[H_label[y][x]]])
if y == 0:
y_img = x_img
else:
y_img = cv2.vconcat([y_img, x_img])
cv2.imwrite("result.jpg", y_img)


if __name__ == "__main__":

base_image = "base.jpg"
color_image = ["red.jpg",
"yellow.jpg",
"green.jpg",
"blue.jpg",
"black.jpg",
"white.jpg"]

MA = MosaicArt(base_image, color_image, size=(200, 200))
label = MA.define_color(4)
MA.connect_image(label)

 

コンストラクタでモザイクアートになる元画像と素材となる画像を読み込みます.

第三引数のsizeは元画像のリサイズに使います.上記だと200*200pixelになります.

元画像のサイズが大きいとめっちゃ時間かかります.

 

define_colorで各ピクセルの色を決めています.

今回は(H_type=4)を元画像の色相から決定した後,白とを元画像のグレースケールからテキトー(x=50)に決定しています.

opencvHSVの色相Hは0~180なので,こんな感じに分けています. 

f:id:chime-n:20190707130824j:plain

かなりずれていますが,もともと5色と少ないので等間隔にやりました.

黄色狭すぎんよ...

 

connect_imageで素材の画像をつなぎ合わせます.

yは縦,xは横です.

 

プログラミング弱者なのでもっと早くできる書き方あるかもしれません.

 

結果

モザイクアートにするのは当然こいつだ!

f:id:chime-n:20190707134435j:plain

かっくぃー!

 

さぁ,結果を刮目してみよ!

f:id:chime-n:20190707134917p:plain

バァーン!

結果は見せられませーん.

なぜかというとメルストのコンテンツ利用ガイドラインの禁止項目に 

・当社ゲームで使用されている画像データの過度なリサイズ,編集加工.

があるから!

 

つらみ...

 

今回は元画像を200*200,素材画像を50*50にまでリサイズしてモザイクアートを作りました.

つまり,完成した画像のサイズは10000*10000です.容量にして100.7MB!

流石にそのままブログに載せることもできないのでサイズを落とすとなると,素材画像が完全に潰れます.

これが過度なリザイズにひっかかっちゃうかもしれないので,折角やったのに載せれませんでした.

こういう感じのでっかい画像が作れました.

f:id:chime-n:20190707191118j:plain

 

この先は君の目で確かめてくれ!

 

総括

メルストのキャラ画像でモザイクアートを作りました.

結果をのせれないという残念なことになり,もはや誰向けの記事なのかわからないです.

ただ,python書く練習にはなりました.

 

ちなみにですが完成したモザイクアートは5色だけでは味気ない感じでした.

素材画像を増やして色を閾値ではなく決定するように書き換えれば,一般的なモザイクアートに近づくと思います.

いつか元気があるときにやってみたいです.

 

最後に

みんな!メルストやろう!

 

以上!