広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

OpenCVで画像をくっきりさせる

OpenCVに関する記述が出てきて、画像をくっきりさせる という技術があることに驚いたので、自分の画像で試してみました。

事前準備

必要なパッケージのインソール

OpenCVが必要です。anaconda には無いようなのでpipでインストールします

qiita.com

pip install opencv-python
pip install opencv-contrib-python

画像を取り込んで確認する

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import cv2
image_cap_bgr = cv2.imread("data/cap.jpg",cv2.IMREAD_COLOR)
plt.imshow(image_cap_bgr)
plt.axis("off")
plt.show()

f:id:yyhhyy:20190811181508p:plain
output_8_0

元の画像がわかりにくかったですが、openCVはRGBではなくBGRで読み取るため、赤と青が逆転しています。

image_cap_rgb = cv2.cvtColor(image_cap_bgr,cv2.COLOR_BGR2RGB)
plt.imshow(image_cap_rgb)
plt.axis("off")
plt.show()

f:id:yyhhyy:20190811181538p:plain
output_11_0

保存しておきます。 ただし、OpenCVは勝手にBGRだと思って保存しますので、Matplotlibで表示するためにRGBにしたものを再びBGRに戻して保存しないといけません。

cv2.imwrite("image_cap_rgb.jpg",,cv2.cvtColor(image_cap_rgb,cv2.COLOR_RGB2BGR))

画像をくっきりさせる

画像をぼやかす(blur)は、各ピクセルを近傍のピクセルの平均値に変換すること。くっきりさせるのはその逆という概念になります

一旦、とある本にあったカーネルを丸パクリしてみます

kernel = np.array([[0,-1,0],
                  [-1,5,-1],
                  [0,-1,0]])
image_cap_sharp1 = cv2.filter2D(image_cap_rgb,-1,kernel) 
plt.imshow(image_cap_sharp1)
plt.axis("off")
plt.show()

f:id:yyhhyy:20190811181807p:plain
output_17_0

cv2.imwrite("image_cap_sharp1.jpg",cv2.cvtColor(image_cap_sharp1,cv2.COLOR_RGB2BGR))

確かに表面の凸凹が実際より強調された気がしますが、なんかもっとわかりやすい例やピンボケ画像が必要ですね。1

ぼかしの逆をすればいいって目からウロコでしたが、知っている人からすれば当たり前のことなんでしょうか。個人的には凄く新鮮でした


  1. そもそも はてなブログにアップする時点で解像度も下がるので益々わからんですね。