Pythonでいろいろやってみる

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

航空写真を加工し地形に穴が開いているように見せる

画像に穴が開いているような加工をします。単純に黒い円を重ねるだけだと自然に見えないので

  • 白地に灰色塗りつぶした円を作成し255で規格化し画像に積算する
  • 円の大きさを少し小さくして同様に積算する
  • これを繰り返す

という手順により中心部に行くほど黒くなる円を描画し穴が開いているように見せます。

使った関数・メソッド
  • cv2.imread() : 画像ファイルの読み出し
  • ndarray.shape() : ndarrayの形状取得
  • numpy.ones() : 全要素の値が1のndarrayの生成
  • cv2.resize() : 画像サイズの変更
  • cv2.imwrite() : 画像を保存する
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

国土地理院の空中写真を元に画像を用意しjupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
f:id:T_A_T:20190421210108p:plain
Maya.jpg (幅303px高さ545px)

コード
import cv2  # OpenCVのインポート
import numpy as np  # numpyをnpという名前でインポート

img = cv2.imread('Maya.png')  # 画像の読み出し
img_height,img_width=img.shape[:2]  # 画像の高さ、幅の取得
img_white = np.ones((img_height, img_width, 3), np.uint8)*255  # imgと同じサイズの白画像を生成 

#白地に灰色の塗りつぶした円を描き255で規格化→それを元画像に掛ける
#円の半径を小さくしながら繰り返すことで中心にいくほど黒い円を描画
for circle_radius in range(80,10,-2):
    img_hole = np.copy(img_white)
    img_hole = cv2.circle(img_hole,(150,200), circle_radius, (220,220,220), -1)
    img_hole = img_hole/255
    img = img*img_hole

cv2.imwrite('Maya_hole.png',img)  # 画像の保存
実行結果

f:id:T_A_T:20190421210136p:plain


別の画像でもやってみます。こちらも国土地理院の空中写真より作成した画像です。
f:id:T_A_T:20190421211235j:plain
Shimoda.jpg (幅600px高さ650px)

import cv2  # OpenCVのインポート
import numpy as np  # numpyをnpという名前でインポート

img = cv2.imread('Shimoda.jpg')  # 画像の読み出し
img_height,img_width=img.shape[:2]  # 画像の高さ、幅の取得 
img_white = np.ones((img_height, img_width, 3), np.uint8)*255  # imgと同じサイズの白画像を生成 

#白地に灰色の塗りつぶした円を描き255で規格化→それを元画像に掛ける
#円の半径を小さくしながら繰り返すことで中心にいくほど黒い円を描画
for circle_radius in range(80,10,-2):
    img_hole = np.copy(img_white)
    img_hole = cv2.circle(img_hole,(450,400), circle_radius, (220,220,220), -1)
    img_hole = img_hole/255
    img = img*img_hole

cv2.imwrite('Shimoda_hole.jpg',img)  # 画像の保存
実行結果

f:id:T_A_T:20190421211042j:plain

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

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