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

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

【画像処理】1次微分フィルタ(横、縦)

自作で微分フィルタを作った。

#!/usr/env/bin python
import cv2
import sys

args = sys.argv

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

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

            edge_width[i, j] = abs(left + right)
            edge_height[i, j] = abs(top + bottom)

    cv2.imwrite('gray.png', image)
    cv2.imwrite('edge_width.png', edge_width)
    cv2.imwrite('edge_height.png', edge_height)

if __name__ == '__main__':
     edge_filter(args[1])

フィルタは以下を適用した。
ただし、画像の端には適用していない。(コード上の、range(1, height-1) と range(1, width-1))

●横方向微分フィルタ

0 0 0
-1/2 0 1/2
0 0 0

●縦方向微分フィルタ

0 -1/2 0
0 0 0
0 1/2 0

■元画像
f:id:akagi13213:20190120155743p:plain

■横方向微分画像
f:id:akagi13213:20190120155754p:plain

■縦方向微分画像
f:id:akagi13213:20190120155808p:plain

余計なエッジを消すために、メディアンフィルタを適用してから微分フィルタを適用する。

メディアンフィルタ 方向微分
f:id:akagi13213:20190120155836p:plain

メディアンフィルタ 方向微分
f:id:akagi13213:20190120155843p:plain

★★比較
f:id:akagi13213:20190120161812j:plain

縦方向微分は横線を抽出し、
横方向微分は縦線を抽出している。