【Python/OpenCV】写真・動画をミニチュア風に変換

Python版OpenCVで写真・動画をミニチュア風に変換する方法をソースコード付きでまとめました。

【写真】ミニチュア風に変換

写真をミニチュア風に変換するには、以下の①②の処理をかけます。

①画像の彩度を上げます。(HSV色空間)
②画面の上部・下部領域にぼかし処理をかけます。(平均値フィルタ)

サンプルコード

Python3 + OpenCV3を使いました。

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

# ミニチュア画像に変換
def miniature(img, sk=2.5):
    # HSVに変換
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 彩度を上げる
    hsv[:,:,1] = hsv[:,:,1] * sk

    # BGRに戻す
    img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)

    # 画像の高さ、幅、チャンネル数を取得
    h, w, ch = img.shape

    # 上下をぼかす
    img[0:int(h/3), :] = cv2.blur(img[0:int(h/3), :], ksize=(5, 5))
    img[int(h/3):int(h/2), :] = cv2.blur(img[int(h/3):int(h/2), :], ksize=(4, 4))    
    img[int(h/2):int(h*2/3), :] = cv2.blur(img[int(h/2):int(h*2/3), :], ksize=(3, 3))
    img[int(h*10/11):h, :] = cv2.blur(img[int(h*10/11):h, :], ksize=(3, 3))  

    return img

# 入力画像の読み込み
img = cv2.imread("input.jpg")

# ミニチュア画像化(彩度を上げる倍率:2.3)
img2 = miniature(img, 2.3)

# 結果を出力
cv2.imwrite("output.jpg", img2)

■入力画像(input.jpg)

■出力画像(output.jpg)

【動画・カメラ】ミニチュア風に変換

続いて、動画・カメラ映像をミニチュア風に変換します。

ソースコード(Python3+OpenCV3)

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

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

# ミニチュア画像に変換
def miniature(img, sk=2.5):
    # HSVに変換
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 彩度を上げる
    hsv[:,:,1] = hsv[:,:,1] * sk

    # BGRに戻す
    img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)

    # 画像の高さ、幅、チャンネル数を取得
    h, w, ch = img.shape

    # 上下をぼかす
    img[0:int(h/3), :] = cv2.blur(img[0:int(h/3), :], ksize=(5, 5))
    img[int(h/3):int(h/2), :] = cv2.blur(img[int(h/3):int(h/2), :], ksize=(4, 4))    
    img[int(h/2):int(h*2/3), :] = cv2.blur(img[int(h/2):int(h*2/3), :], ksize=(3, 3))
    img[int(h*9/10):h, :] = cv2.blur(img[int(h*9/10):h, :], ksize=(3, 3))  

    return img



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

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

while (cap.isOpened()):
    ret, frame = cap.read()
    
    # 画面表示
    cv2.imshow('frame', miniature(frame, 1.3))

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

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