Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

写真をミニチュア風に加工する

ミニチュア写真の特徴として

  • 斜め上から撮影されている
  • コントラストが強い
  • 上下がぼけている

があります。
なので、 斜め上から撮影した写真にコントラスト強調処理と画像上下のぼかし処理をすることでミニチュア風加工ができます。
コントラスト強調はルックアップテーブルによるS字カーブコントラスト補正を用いました(ルックアップテーブルによる画像コントラストの補正)。上下のぼかしは画像を縦に5分割しcv2.blurメソッドで両端を5x5カーネルblur処理、その内側を3x3カーネルblur処理、中央は何もしないことで、端に行くほどぼけるように見せています(画像の上下のみぼかす)。

使った関数・メソッド
  • cv2.imread() : 画像ファイルの読み出し
  • cv2.LUT() : 入力画素値とルックアップテーブルから出力画素値を計算
  • cv2.blur() : 画像の平均化
  • cv2.vconcat() : 画像を縦に連結
  • cv2.imwrite() : 画像を保存する
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

駐車場の写真を使います。
f:id:T_A_T:20190519120029j:plain

コード
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)  
実行結果

f:id:T_A_T:20190519120134j:plain

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村