【画像処理】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 |
●横方向二次微分
●縦方向二次微分
●4近傍(ラプラシアンフィルタ)
★なぜ1次微分より2次微分のほうがエッジが目立つ?
左から、元画像・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倍になっている。