【Python/OpenCV】写真・動画をドット絵風に変換

Python版OpenCVで写真・動画をドット絵風に変換する方法をソースコード付きでまとめました。

【写真】ドット絵風に変換

写真をドット絵に変換するには、以下の①②の処理をかけます。

① 画像をモザイク処理します。(単純に拡大→縮小)
② 画像を減色処理(k平均法で色の数を削減)します。

サンプルコード

Python3 + OpenCV3を使いました。

# -*- coding: utf-8 -*-
import cv2
import numpy as np

# 減色処理
def sub_color(src, K):
    # 次元数を1落とす
    Z = src.reshape((-1,3))

    # float32型に変換
    Z = np.float32(Z)

    # 基準の定義
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)

    # K-means法で減色
    ret, label, center = cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)

    # UINT8に変換
    center = np.uint8(center)

    res = center[label.flatten()]

    # 配列の次元数と入力画像と同じに戻す
    return res.reshape((src.shape))


# モザイク処理
def mosaic(img, alpha):
    # 画像の高さ、幅、チャンネル数
    h, w, ch = img.shape

    # 縮小→拡大でモザイク加工
    img = cv2.resize(img,(int(w*alpha), int(h*alpha)))
    img = cv2.resize(img,(w, h), interpolation=cv2.INTER_NEAREST)

    return img


# ドット絵化
def pixel_art(img, alpha=2, K=4):
    # モザイク処理
    img = mosaic(img, alpha)

    # 減色処理
    return sub_color(img, K)


# 入力画像を取得
img = cv2.imread("input.jpg") 

# ドット絵化
dst = pixel_art(img, 0.5, 4)
    
# 結果を出力
cv2.imwrite("output.jpg", dst)

■入力画像(input.jpg)

■出力画像(output.jpg)
左(alpha=0.5、K=4)、右(alpha=0.3、K=3)

お借りした画像:プロ生ちゃん(暮井 慧)

【動画・カメラ】ドット絵風に変換

続いて、動画・カメラ映像をドット絵風に変換します。

ソースコード

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import numpy as np
import cv2

# 減色処理
def sub_color(src, K):
    # 次元数を1落とす
    Z = src.reshape((-1,3))

    # float32型に変換
    Z = np.float32(Z)

    # 基準の定義
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)

    # K-means法で減色
    ret, label, center = cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)

    # UINT8に変換
    center = np.uint8(center)

    res = center[label.flatten()]

    # 配列の次元数と入力画像と同じに戻す
    return res.reshape((src.shape))

# モザイク処理
def mosaic(img, alpha):
    # 画像の高さ、幅、チャンネル数
    h, w, ch = img.shape

    # 縮小→拡大でモザイク加工
    img = cv2.resize(img,(int(w*alpha), int(h*alpha)))
    img = cv2.resize(img,(w, h), interpolation=cv2.INTER_NEAREST)

    return img

# ドット絵化
def pixel_art(img, alpha=2, K=4):
    # モザイク処理
    img = mosaic(img, alpha)

    # 減色処理
    return sub_color(img, K)



cap = cv2.VideoCapture("input.mp4")
fps = 30

# 録画する動画のフレームサイズ(webカメラと同じにする)
size = (640, 480)

while (cap.isOpened()):
    ret, frame = cap.read()
    
    # 画面表示
    cv2.imshow('frame', pixel_art(img, 0.5, 4))

    # キー入力待機
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 終了処理
cap.release()
cv2.destroyAllWindows()
関連記事
1 PythonでOpenCV入門 サンプル集
2 【Python】画像処理プログラミング入門
3 【画像処理入門】アルゴリズム&プログラミング
Python画像処理
技術雑記

コメント

タイトルとURLをコピーしました