프로그래밍/openCV

엣지 검출하기 (feat. sobel, Laplacian, Canny)

갑자기 내리는 비 2021. 4. 20. 19:17

엣지란 이미지데이터에서 급격한 값이 변화가 보이는 지점을 말합니다. 

위와 같이 검은색, 하얀색, 검은색의 값이 나타나는 데이터라면 [ 0, 255, 0 ] 의 형식으로 되어있어, 첫번째와 두번째는 255라는 차이값이, 그리고 두번째에서 세번째는 -255라는 차이값이 생기므로 2개의 엣지가 검출됩니다. 어느정도의 차이부터 엣지로 검출할지는 사용자가 지정합니다. ( 사용자가 지정하는 값을 threshold라고 부릅니다. )

 

sobel을 이용해 엣지를 검출한다면 x축으로 검출하는 방법, y축으로 검출하는 방법이 있습니다.( 엣지검출을 위한 방향을 정해주어야 합니다.  )

첫번째 사진이 엣지검출을 위한 이미지입니다. 두번째 사진은 sobel 사용해 x축과 y축으로 엣지검출한 값을 합한 이미지입니다. 세번재는 y축으로, 네번째는 축으로 엣지검출한 이미지입니다.( 엣지검출시 검정색 -> 흰색 으로 이동하는 +값의 변화만 엣지검출하는 모습을 확인할 수 있습니다. )

 

 x축으로, y으로 2번의 과정 거치지 않고 라플라시안 필터를 사용한다면 바로 모든 엣지검출을 할 수 있습니다. 그리고 따로 지정해주지 않아도 +값만이 아닌 -값도 엣지검출을 해주어 프로그래밍이 훨씬 수월합니다.

 

일반적인 사진에서 엣지검출을 할 경우 처리하기 쉬운 사진으로는 괜찮지만 만약 사진에 노이즈가 많다면 노이즈들 또한 값의 변화가 크므로 모두 엣지로 검출됩니다.( 이럴 경우, 이미지를 블러링처리를 한 후에 엣지검출을 해야합니다. )

sobel방식으로 노이즈가 낀 이미지를 엣지검출한 모습입니다.

블러링 후에 이미지의 경계부분이 뭉게진다면 데이터를 더 뚜렷하게 만들어주는 필터를 이용해 컨벌루션해준 후에 엣지검출을 합니다.( 데이터의 값을 뚜렷하게 만들어주는 필터를 사용합니다.

간단하게 만든 3x3행렬을 이용했습니다. [[0,-1,0], [-1,5,-1], [0,-1,0]]

 

블러링 처리 후 엣지검출을 따로따로 하는것이 아닌 한번에 하는 알고리즘이 있는데 이것을 Canny Edge Detecttion이라고 합니다. 

 

가우시안 블러로 노이즈 제거 후 엣지검출을 해줍니다. 사용자는 엣지검출에서 엣지로 인정하는 최소값( threshold )을 바꿔가며 적절한 엣지검출이 나올때까지 테스트합니다. 

 

Trackbar를 이용해 적절한 threshold값을 정해주면 보다 정확한 엣지검출을 할 수 있습니다.