엣지 감지 예시

  • 수직 엣지를 검사하기 위해 컨볼루션 연산을 알아보자
  • 컨볼루션 연산에서 data 에 곱해지는 행열을 Kernel 또는 Filter 라고 한다.
  • 컨볼루션 연산에서는 아다마르 곱을 사용한다.

아다마르 곱셉

컨볼루션 연산

def conv2d(data, filters):
    assert len(data) >= len(filters) and len(data[0]) >= len(filters[0])
    result = []
    for i in range(len(data) - len(filters) + 1):
        row = []
        for j in range(len(data[0]) - len(filters[0]) + 1):
            temp = 0
            for k in range(len(filters)):
                for l in range(len(filters[0])):
                    temp += data[i + k][j + l] * filters[k][l]
            row.append(temp)
        result.append(row)
    return result
  • 기본 연산 방법

이것이 엣지를 검출할 수 있는 이유

data1 = [
    [10,10,10,0,0,0],
    [10,10,10,0,0,0],
    [10,10,10,0,0,0],
    [10,10,10,0,0,0],
    [10,10,10,0,0,0],
    [10,10,10,0,0,0],
]
  • 위 이미지는 좌측은 밝은 색, 우측은 어두운 색으로 이루어져 있으며 우리는 중앙에 있는 수직 엣지를 인식해야한다.
kernel = [
    [1,0,-1],
    [1,0,-1],
    [1,0,-1]
]
  • 수직 엣지를 검출하기 위해 커널을 위와같이 설정하고 서로 컨볼루션 연산을 실행하면 결과는 다음과 같다.
[
    [0, 30, 30, 0],
    [0, 30, 30, 0],
    [0, 30, 30, 0],
    [0, 30, 30, 0]
]
  • 수직 엣지가 검출되었다.
  • 수직 엣지가 두꺼워보이는데, 이는 이미지가 작아서 그렇다.