映画のマトリックスを観てきたので
それ風の画像に変換するプログラムを
作って見ました。

解説動画はこちら




さて今回は
映画のマトリックスに出てきたような
緑色の文字が羅列されたような風合いの
画像に変換するプログラムです。

仕組みとしては
opencvで画像の輪郭を抽出し
その輪郭部分を文字画像で
置き換えるというものです。

サンプルコードはこちら

from PIL import Image, ImageDraw, ImageFont
import cv2
import numpy as np
import random
import string 
import matplotlib.pyplot as plt
%matplotlib inline

# フォントサイズの指定
font_size = 10

# テキスト画像の生成
def make_text_img(font_path="/System/Library/Fonts/Courier.dfont"):    
    text = string.printable[0:-5]
    im = Image.new('RGB', (int(len(text)//3*2*font_size), font_size), (0, 0, 0))
    draw = ImageDraw.Draw(im)
    font = ImageFont.truetype(font_path, font_size)
    draw.text((0, 0),text, fill=(80, 255, 80), font=font) 
    return np.asarray(im)

# 要フォントパスの確認を
text_img = make_text_img()

# 画像の読み込み
img = cv2.imread('画像のパス') 

img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
height , width = img2.shape

# エッジ画像の作成
edges = cv2.Canny(img2,50,100) 
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# マトリックス画像の生成
x = width//font_size*font_size
y = height//font_size*font_size
resize = cv2.resize(edges,(x, y)) 
matrix = np.zeros((y, x, 3), np.uint8) 

for y2 in range(0, y, font_size):
    for x2 in range(0, x, int(font_size//2)):
        if np.amax(resize[y2:y2+font_size, x2:x2+font_size//2])>0: 
            pos = int(random.random()*len(text))*font_size//2
            matrix[y2:y2+font_size, x2:x2+font_size//2] = text_img[0:font_size, pos:pos+font_size//2]
            
# 画像の表示
fig, axes = plt.subplots(nrows=1, ncols=3, sharex=False)
fig.set_figwidth(15)
for i,ig in enumerate([img,edges,matrix]):
    axes[i].imshow(ig)
    axes[i].axis('off')
plt.show()

一応Mac用で作っているので
Windowsの人は
フォントの場所を指定しないと
うまく動かない可能性があります。

その場合はフォントのパスを指定するように
コードを書き換えて下さい。

実行する際は
画像のパスを指定するだけで動くと思います。

実行すると
・元画像
・エッジ画像
・マトリックス風画像
の3つの画像が表示されると思います。

試しに人の顔画像でやってみると・・

download

こんな感じですね。
人の輪郭部分も上手くとれていますね。

エッジの抽出では閾値を指定しているので
上手く検出できない場合は
edges = cv2.Canny(画像,閾値1,閾値2)
 ここの部分の閾値をうまく調整して下さい。

ビル画像とかでやるとかなりクリアに出来ますね。

download-3


今回は映画マトリックス風の画像に変換する
フィルタープログラムのご紹介でした。

試した仕方はコピペして
遊んでみて下さい。

今回はこれまでです。
それでは。