<!--親の顔より見た光景-->

日々の発見を残していきます。

【画像処理】2次微分フィルタ

二次微分フィルタを自作した。

def edge_filter_2(file):
    image = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
    (height, width) = image.shape[:2]

    edge_width = image.copy()
    edge_height = image.copy()
    edge_lap = image.copy()
    for i in range(1, height-1):
        for j in range(1, width-1):
            left = image[i, j-1]
            right = image[i, j+1]
            top = image[i-1, j]
            bottom = image[i+1, j]
            center = -image[i, j] * 2

            edge_width[i, j] = abs(left + right + center)
            edge_height[i, j] = abs(top + bottom + center)
            edge_lap[i, j] = abs(top + bottom + left + right + center*2)
 
    cv2.imwrite('gray.png', image)
    cv2.imwrite('edge2_width.png', edge_width)
    cv2.imwrite('edge2_height.png', edge_height)
    cv2.imwrite('edge2_lap.png', edge_lap)

参考は以下。
画像処理フィルタの1次微分と2次微分の違い | ぱーくん plus idea

適用フィルタは以下。
横方向

0 0 0
1 -2 1
0 0 0

縦方向

0 1 0
0 -2 0
0 1 0

4近傍

0 1 0
1 -4 1
0 1 0

●横方向二次微分
f:id:akagi13213:20190120184119p:plain

●縦方向二次微分
f:id:akagi13213:20190120184130p:plain

●4近傍(ラプラシアンフィルタ)
f:id:akagi13213:20190120184140p:plain

★なぜ1次微分より2次微分のほうがエッジが目立つ?
f:id:akagi13213:20190120184749p:plain
左から、元画像・1次微分(横方向)・2次微分(横方向)

横方向微分の1次微分と2次微分の出力差を見てみる。
仮に、顔の輪郭にフィルタを適用するとして、
フィルタ適用前画素列を、以下とする

32 32 64 64 64 64 255 255

★★1次微分(横方向)

-1/2 0 1/2

このフィルタを適用すると(左端・右端は元画像のままとする)、

32 32 64 64 64 64 255 255

 ↓↓ 1次微分適用

32 16 16 0 0 95 95 255

★★2次微分(横方向)

1 -2 1

このフィルタを適用すると(左端・右端は元画像のままとする)、
※絶対値を画素値として採用

32 32 64 64 64 64 255 255

 ↓↓ 2次微分適用

32 32 -32 0 0 191 -191 255

1次微分より白成分が2倍になっている。