【OpenCV】filter2Dを使って画像をアンシャープマスキング(鮮鋭化)する方法[Python]

  • URLをコピーしました!
目次

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のノイズを入れる方法、そして砂嵐ノイズを入れる方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次