#!/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であまり変化がない。
周辺色と中心色の変化が大きい場合、黒よりはより黒く、白よりはより白くなるような感じです。
コメント