写真をミニチュア風に加工する
ミニチュア写真の特徴として
- 斜め上から撮影されている
- コントラストが強い
- 上下がぼけている
があります。
なので、 斜め上から撮影した写真にコントラスト強調処理と画像上下のぼかし処理をすることでミニチュア風加工ができます。
コントラスト強調はルックアップテーブルによるS字カーブコントラスト補正を用いました(ルックアップテーブルによる画像コントラストの補正)。上下のぼかしは画像を縦に5分割しcv2.blurメソッドで両端を5x5カーネルでblur処理、その内側を3x3カーネルでblur処理、中央は何もしないことで、端に行くほどぼけるように見せています(画像の上下のみぼかす)。
使った関数・メソッド
- cv2.imread() : 画像ファイルの読み出し
- cv2.LUT() : 入力画素値とルックアップテーブルから出力画素値を計算
- cv2.blur() : 画像の平均化
- cv2.vconcat() : 画像を縦に連結
- cv2.imwrite() : 画像を保存する
環境
準備
駐車場の写真を使います。
コード
import cv2 import numpy as np import math import matplotlib.pyplot as plt # 画像の読み出し img = cv2.imread('miniature/parking.jpg') # S字カーブのルックアップテーブル生成 look_up_table = np.zeros((256,1),dtype=np.uint8) for i in range(256): look_up_table[i][0] = 255*(math.sin(math.pi*(i/255-0.5))+1)/2 # 変換後の画像生成、保存 img_lut = cv2.LUT(img, look_up_table) height,width=img_lut.shape[:2] # 画像の高さ、幅の取得 height_fifth = int(height/5) # 画像の高さ/5 # 画像を縦に5分割 img1 = img_lut[:height_fifth:,:].copy() img2 = img_lut[height_fifth:height_fifth*2,:,:].copy() img3 = img_lut[height_fifth*2:height_fifth*3,:,:].copy() img4 = img_lut[height_fifth*3:height_fifth*4,:,:].copy() img5 = img_lut[height_fifth*4:,:,:].copy() # blur処理 img1_blur = cv2.blur(img1,(5,5)) img2_blur = cv2.blur(img2,(3,3)) img4_blur = cv2.blur(img4,(3,3)) img5_blur = cv2.blur(img5,(5,5)) # 5つの画像を縦に連結 img_blur = cv2.vconcat([img1_blur,img2_blur,img3,img4_blur,img5_blur]) # 画像の保存 cv2.imwrite('miniature/miniature.jpg',img_blur)
実行結果