今回はOpencvでピクセルアートを作ってみました。
ようはドット絵に加工するやつです。
解説動画はこちら
さて今回はピクセルアート
平たく言うと画像をドット絵に加工するやつです。
さっそくコードを見ていきましょう。
こんな感じの関数を用意しました。
モザイク処理で引き伸ばしを行ったのちに
減色処理を行って色を減らして
それっぽくします。
使う際はこんな感じで
いい感じに加工されましたね。
alphaを減らすと画像が荒くなり
kを増やすと色合いが増えます。
こんな感じで色合いとかを調整すれば
ピクセルアートっぽくなります。
コードの仕組みとしては
cv2.kmeans というのでk-means法を使って
画像の色をk個のグループに落とし込んでいます。
そうすることで減色加工ができている訳ですね。
4色にした場合、背景に1色取られてしまい
残りの3色で人を表す感じになっちゃいます。
4色でもなかなか表現力は高いですね。
今回はopnecvを用いた
ピクセルアートの作り方でした。
それでは。
解説動画はこちら
さて今回はピクセルアート
平たく言うと画像をドット絵に加工するやつです。
さっそくコードを見ていきましょう。
import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inline # 減色加工 def color_reduction(im, k): z = im.reshape(-1, 3).astype(np.float32) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) # K-means法で減色する ret, lab, cter = cv2.kmeans(z, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS) cter = np.uint8(cter) return cter[lab.flatten()].reshape(im.shape) # モザイク加工 def mosaic(im, alpha): h, w, ch = im.shape res = cv2.resize(im,(int(w*alpha), int(h*alpha))) res = cv2.resize(res,(w, h), interpolation=cv2.INTER_NEAREST) return res # ドット絵加工 def pixel_proc(im, alpha=0.5, k=8): return color_reduction(mosaic(im, alpha), k)
こんな感じの関数を用意しました。
モザイク処理で引き伸ばしを行ったのちに
減色処理を行って色を減らして
それっぽくします。
使う際はこんな感じで
# 入力画像 img = cv2.imread('画像のパス') # ドット絵加工 k = 8 alpha = 0.3 dots = pixel_proc(img, alpha, k) # 表示 plt.figure(figsize=(16,16)) plt.subplot(1,2,1) plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.axis("off") plt.subplot(1,2,2) plt.imshow(cv2.cvtColor(dots, cv2.COLOR_BGR2RGB)) plt.axis("off") plt.show()
いい感じに加工されましたね。
alphaを減らすと画像が荒くなり
kを増やすと色合いが増えます。
こんな感じで色合いとかを調整すれば
ピクセルアートっぽくなります。
コードの仕組みとしては
cv2.kmeans というのでk-means法を使って
画像の色をk個のグループに落とし込んでいます。
そうすることで減色加工ができている訳ですね。
im = cv2.imread('画像のパス') z = im.reshape(-1, 3).astype(np.float32) k = 4 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) ret, lab, cter = cv2.kmeans(z, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS) lab = lab.squeeze(axis=1) cter = cter.astype(np.uint8) _, counts = np.unique(lab, axis=0, return_counts=True) dots = cter[lab.flatten()].reshape(im.shape) fig, [ax1, ax2 , ax3] = plt.subplots(1, 3, figsize=(16, 5)) fig.subplots_adjust(wspace=0.3) colors = cter[:, ::-1] / 255 texts = list(map(str, cter)) ax1.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)) ax1.set_axis_off() ax2.imshow(cv2.cvtColor(dots, cv2.COLOR_BGR2RGB)) ax2.set_axis_off() ax3.barh(np.arange(k), counts, color=colors, tick_label=texts) plt.show()
4色にした場合、背景に1色取られてしまい
残りの3色で人を表す感じになっちゃいます。
4色でもなかなか表現力は高いですね。
今回はopnecvを用いた
ピクセルアートの作り方でした。
それでは。
コメントする