OpenCV
前回、4種のノイズ除去フィルタ(blue、GaussianBlur、medianBlur、birateralFilter)の使い方(画像のぼかし、平滑化)を紹介しました。
今回は画像の鮮鋭化(知らなかったのですがアンシャープマスキングというようです)をOpenCVのfileter2Dという関数を使ってやる方法を紹介します。
画像をシャープにするということなので、前回ノイズ除去フィルタを扱ったぼやかした画像(ファイル名はpython-opencv-14.png)をもとに試してみたいと思います。
ちなみに画像の読み込みまではこんな感じです。
import cv2
import numpy as np
import os
default_dirpath = os.getcwd()
filename = "python-opencv14-1.png"
filepath = os.path.join(default_dirpath, filename)
img = cv2.imread(filepath, cv2.IMREAD_COLOR)
それでは始めていきましょう。
filter2Dで鮮鋭化
前回は準備されたフィルタを用いて、パラメータを少し変えただけでしたが、鮮鋭化に関してはフィルタが準備されていない様です。
そこで任意のフィルタをかけられる「filter2D」という関数を用いてフィルタをかけていきます。
使い方としては「cv2.filete2D(読み込んだ画像データ, 出力画像の型, フィルタ)」です。
またフィルタは2次元リストとして定義します。
今回は画像をシャープにしたいので、ある点を中心にして、中心の色の強度を強く、その周りの色の強度を弱くします。
kernel = np.array([
[-k, -k, -k],
[-k, 1+8*k, -k],
[-k, -k, -k]
])
ちなみにノイズ除去フィルタ(つまりはぼかしフィルタであり平均化フィルタ)の場合は、3x3の9ピクセルなら全てのピクセルの強度を足し1/9にするといったことをします。
とりあえず先ほどのフィルタを使って処理するとこうなります。
import cv2
import numpy as np
import os
default_dirpath = os.getcwd()
filename = "python-opencv14-1.png"
filepath = os.path.join(default_dirpath, filename)
k = 1
kernel = np.array([
[-k, -k, -k],
[-k, 1+8*k, -k],
[-k, -k, -k]
])
img = cv2.imread(filepath, cv2.IMREAD_COLOR)
sharpend_img = cv2.filter2D(img, -1, kernel)
output = os.path.join(default_dirpath, "python-opencv14-2.png")
cv2.imwrite(output, sharpend_img)
実行結果
全体的にシャープにはなりましたが、ぼやけた感じはやっぱり残ってしまいます。
ちなみに先ほどの「k」の値を変えるとフィルタの強度を変えることができます。
import cv2
import numpy as np
import os
default_dirpath = os.getcwd()
filename = "python-opencv14-1.png"
filepath = os.path.join(default_dirpath, filename)
k = 0.1
kernel = np.array([
[-k, -k, -k],
[-k, 1+8*k, -k],
[-k, -k, -k]
])
img = cv2.imread(filepath, cv2.IMREAD_COLOR)
sharpend_img = cv2.filter2D(img, -1, kernel)
output = os.path.join(default_dirpath, "python-opencv14-3.png")
cv2.imwrite(output, sharpend_img)
実行結果
また他のアンシャープマスクとして上下左右のピクセルを弱くして、その分中央のピクセルを強くするというマスクもあるようです。
kernel = np.array([
[0, -k, 0],
[-k, 1+4*k, -k],
[0, -k, 0]
])
import cv2
import numpy as np
import os
default_dirpath = os.getcwd()
filename = "python-opencv14-1.png"
filepath = os.path.join(default_dirpath, filename)
k = 1
kernel = np.array([
[0, -k, 0],
[-k, 1+4*k, -k],
[0, -k, 0]
])
img = cv2.imread(filepath, cv2.IMREAD_COLOR)
sharpend_img = cv2.filter2D(img, -1, kernel)
output = os.path.join(default_dirpath, "python-opencv14-4.png")
cv2.imwrite(output, sharpend_img)
実行結果
次回はOpenCVで白黒、またはRGBのノイズを入れる方法、そして砂嵐ノイズを入れる方法を紹介します。
ではでは今回はこんな感じで。
コメント