見出し画像

実験の写真opencvで作っちゃえ

注意:茶番はノンフィクション読み飛ばし推奨

(茶番)先日学校で実験をした。内容はアセンブリでコードを書き、実機に転送して光を変化させるという内容だった。帰宅後、実験レポートに取り掛かるが必要な写真が足りていない。「再実験」恐怖の三文字が頭に浮かんだ。ライトが白く光った写真はある!この光をピンクにした写真があれば……「pythonで作るしかない」

1 目的&実行環境

目的:下の写真の光の部分の色の変化

実行環境:python -2.7,opencv-3.1

2 アルゴリズム?

1, 光っている部分を検出しそれ以外にマスク
2, 1の画像のノイズ除去
3, 1の検出した部分を着色
4, リアルの画像と合成

3 結果

まず写真をグレースケールで読み込み光っている部分の明るさ以下にマスクをかける。

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
img =cv2.imread('photo',0)
img2 = cv2.imread('photo')
 
plt.imshow(img)
plt.colorbar()
plt.show()

表示された画像より閾値を255とする。

img[img < 255] = 0
img[img >= 255] = 1

すこし光とは関係ない部分が検出されているため、収縮してノイズ除去する。今回は24近傍で収縮する。

kernel = np.ones((5,5),np.uint8)
img = cv2.erode(img,kernel,iteration=1)

いい感じに光っている部分が検出できた。

着色については上手く色付けする方法が思いつかなかったため、ごり押し。写真と同じ型の配列を用意して、検出した座標にピンクの配列を代入して、カラー写真と合成する。(ここで手を抜いたのが敗因かも笑)

newimg = np.zeros((img.shape[0],img.shape[1],3)
,uint8)
 for x in range(img.shape[0]):
      for y in range(img,shape[1]):
          if img[x,y] ==1:
              newimg[x,y] = [255,102,204]
newimg = newimg + img2
plt.imshow(newimg)
plt.colorbar()
plt.show()

なんか全体的に青いし、ピンクの光には見えない。しかし正確に光の部分を検出し、色をつけることが出来た。

4 その後(茶番)

出来上がった画像は、到底実験レポートで使えるようなものでは無かった。自分の画像処理技術力の無さを嘆きながら、再実験に向かうことを決意した。

5 感想

画像処理と配列操作の基本の復習が出来た。改善点としては、色の付け方をもっと正確にする必要を感じた。しかし、色が光を写真で写したように見えない。この改善点は調べるしかなさそう。

6 参考

カラーチャート

https://www.scollabo.com/banban/lectur/websafe.html



この記事が気に入ったらサポートをしてみませんか?