PythonとOpenCVでアンシャープマスキング

pythonコンピュータ
python
#!/usr/bin/env python3

import cv2
import numpy as np

def UnSharpMasking(gray, k=1.0):
    kernel = np.array([[-k/9.0, -k/9.0, -k/9.0],
                    [-k/9.0, 1 + (8 * k)/9.0, -k/9.0],
                    [-k/9.0, -k/9.0, -k/9.0]])
    dst = cv2.filter2D(gray, -1, kernel)
    return dst

gray = cv2.imread("00184.jpg", 0)
sharp = UnSharpMasking(gray, 1.0)
cv2.imwrite("unsharpmask.png", sharp)

filter2Dは引数のkernelを各ピクセルに対し乗算し合計値を中心にセットします。
例えば3×3のカーネルで全て1/9をセットされていると、9ピクセルの1/9の合計値ですので、平均値となり画像全体をぼかす処理になります。

それではアンシャープマスクフィルタのカーネルではどのような結果になるか計算してみます。

k=1.0
画像例

127127127
12764127
127127127

カーネル

-1/9-1/9-1/9
-1/91+8/9-1/9
-1/9-1/9-1/9

演算=画像×カーネル

-14.11-14.11-14.11
-14.1164+56.89-14.11
-14.11-14.11-14.11

結果:8.01=64+56.89-14.11*8

周辺が127の灰色で中心が64の黒よりの灰色の場合、結果中心が8で黒に近づく。

k=1.0
画像例

127127127
127192127
127127127

カーネル

-1/9-1/9-1/9
-1/91+8/9-1/9
-1/9-1/9-1/9

演算=画像×カーネル

-14.11-14.11-14.11
-14.11192+170.67-14.11
-14.11-14.11-14.11

結果:249.79=192+170.67-14.11*8

周辺が127の灰色で、中心が192の白よりの灰色の場合、結果中心が250で白に近づく。

k=1.0
画像例

127127127
127127127
127127127

カーネル

-1/9-1/9-1/9
-1/91+8/9-1/9
-1/9-1/9-1/9

演算=画像×カーネル

-14.11-14.11-14.11
-14.11127+112.89-14.11
-14.11-14.11-14.11

結果:127.01=127+112.89-14.11*8

周辺が127の灰色で、中心も127の灰色の場合、結果中心は127であまり変化がない。

周辺色と中心色の変化が大きい場合、黒よりはより黒く、白よりはより白くなるような感じです。

コメント