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
画像例

127 127 127
127 64 127
127 127 127

カーネル

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

演算=画像×カーネル

-14.11 -14.11 -14.11
-14.11 64+56.89 -14.11
-14.11 -14.11 -14.11

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

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

k=1.0
画像例

127 127 127
127 192 127
127 127 127

カーネル

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

演算=画像×カーネル

-14.11 -14.11 -14.11
-14.11 192+170.67 -14.11
-14.11 -14.11 -14.11

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

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

k=1.0
画像例

127 127 127
127 127 127
127 127 127

カーネル

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

演算=画像×カーネル

-14.11 -14.11 -14.11
-14.11 127+112.89 -14.11
-14.11 -14.11 -14.11

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

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

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

コメント