5.14. 가우시안 스무딩과 에지¶
고전적인 머신 비전에서 이웃 윈도우가 사용되는 용도는 두 가지 작업이 지배합니다: 픽셀 간 변동을 깔끔하게 스무딩하는 것과, 이미지가 급격히 변하는 에지를 찾는 것입니다. 가우시안 필터는 첫 번째를 위한 표준 도구이고, Laplacian 기반 검출기는 두 번째를 위한 표준 도구입니다 – 그리고 이 둘은 결합되는데, 모든 에지 검출기가 약간 스무딩된 입력에서 더 잘 동작하기 때문입니다.
5.14.1. 가우시안 필터¶
gaussian() 은 mean() 의 중심 가중 버전 사촌입니다. 둘 다 각 픽셀의 이웃에 대한 평균을 계산하지만, 가우시안의 가중치는 균일하지 않습니다: 이웃의 중심에 가까운 픽셀일수록 더 많이 반영되고, 이웃의 가장자리에 있는 픽셀일수록 덜 반영되며, 가중치는 이 필터에 이름을 부여한 익숙한 종 모양 곡선을 따릅니다.
종 모양의 가중이 바로 가우시안 필터를 박스 평균보다 더 부드럽게 만드는 요인입니다. 평균 필터링은 객체의 가장자리에서 눈에 띄는 아티팩트를 만들어 낼 수 있습니다 – 가중치의 급격한 컷오프가 가파른 전이 지점에서 작은 링잉 패턴을 도입합니다. 가우시안의 부드럽게 감소하는 가중치는 그 링잉을 피하고 “블러”가 마땅히 보여야 할 모습에 더 가까운 결과를 만들어 냅니다. 그 대가는 평균 필터보다 픽셀당 연산이 더 많다는 것이지만 극적으로 많지는 않습니다 – 픽셀당 비용은 여전히 양방향(bilateral) 필터보다 훨씬 낮습니다.
img.gaussian(1) # 3x3 Gaussian -- a clean light blur
img.gaussian(2) # 5x5 Gaussian -- stronger smoothing
가우시안 스무딩은 거의 모든 에지 검출 파이프라인의 표준 첫 단계 입니다. 아래의 에지 검출기들은 모두 고주파 콘텐츠를 증폭시키는데, 여기에는 알고리즘이 실제로 검출하고 싶지 않은 센서 노이즈도 포함됩니다. 먼저 가벼운 가우시안을 실행하면 실제 에지를 크게 부드럽게 하지 않으면서 그 노이즈를 억제하여, 에지 검출기가 얼룩(speckle) 대신 실제 에지를 찾도록 해 줍니다.
5.14.2. 언샤프 마스킹¶
이미지의 가우시안 블러 복사본은 고전적인 샤프닝에 언샤프 마스크 기법이 사용하는 원료입니다. 필터에 unsharp=True 를 설정하면 필터가 “블러된 이미지를 만들어 내는” 동작에서 “블러된 이미지를 원본에서 빼고 그 차이를 원본에 다시 더하는” 동작으로 전환됩니다 – 그 효과는 고주파 에지가 매끈한 내부에 비해 증폭되는 것입니다.
img.gaussian(1, unsharp=True)
선택적 매개변수 mul 과 add 는 언샤프 결과의 강도를 스케일합니다. 기본값(mul=1.0, add=0.0)은 센서 노이즈를 과장하지 않는 적당한 샤프닝입니다.
5.14.3. Laplacian 필터¶
laplacian() 은 이미지의 2차 공간 미분 의 이산 근사를 실행합니다. 출력은 픽셀 값이 빠르게 변하는 곳에서 크고, 일정하거나 선형으로 변하는 곳에서는 0에 가깝습니다. 그 결과의 자연스러운 해석은 에지 응답입니다: 이미지가 급격히 변하는 픽셀은 밝아지고, 매끈한 내부의 픽셀은 어둡게 유지됩니다.
img.laplacian(1) # 3x3 Laplacian -- edge response
gaussian 과 동일한 매개변수를 사용할 수 있습니다. sharpen=True 는 샤프닝된 이미지를 만들어 냅니다(Laplacian이 단독으로 반환되는 대신 원본에 다시 더해집니다). mul 과 add 는 응답을 스케일합니다.
에지 검출을 넘어선 실용적인 용도 하나는 초점 측정 입니다. 어떤 영역에 걸쳐 평균낸 Laplacian 응답은 그 영역이 얼마나 많은 고주파 콘텐츠를 담고 있는지에 대한 대략적인 척도를 제공합니다. 초점이 잘 맞은 프레임에서는 그 평균이 높고, 흐릿한 프레임에서는 떨어집니다. 프레임 간 Laplacian 응답을 비교하는 것은 더 비싼 대비(contrast) 척도 없이 “렌즈의 초점이 맞았는가?”를 묻는 저렴한 방법입니다.
5.14.4. find_edges 메서드¶
find_edges() 는 단순한 에지 응답 필터가 아니라 완전한 에지 검출 파이프라인을 실행합니다. 이는 그레이스케일 이미지에서 동작하며, 그 결과는 입력이 에지로 간주되어야 할 종류의 밝기 변화를 가지는 위치를 0이 아닌 픽셀로 표시한 이진 이미지입니다.
이 메서드는 두 알고리즘 사이에서 선택하는 edge_type 매개변수를 받습니다:
EDGE_SIMPLE 은 고역 통과 필터를 실행하고, 임계값을 적용한 뒤, 결과를 반환합니다. 빠르지만, 출력에는 임계값을 넘는 모든 밝기 변화가 포함되며 여기에는 애플리케이션이 아마도 신경 쓰지 않을 노이즈와 텍스처도 들어갑니다. 깨끗한 이미지나 노이즈가 이후의 형태학적 패스로 정리될 경우에 적합합니다.
EDGE_CANNY 는 Canny 에지 검출기를 실행합니다 – 고전적인 다단계 알고리즘입니다. 이는 밝기 그래디언트를 계산하고, 그래디언트 방향을 따라 최대가 아닌 모든 응답을 억제하며(따라서 각 에지가 1픽셀 너비가 됩니다), 히스테리시스 임계값을 적용합니다(따라서 한 지점에서 강한 에지는 중간에 희미해지더라도 추적됩니다). 그 결과는 모든 고전적인 에지 기반 알고리즘이 원하는 종류의 깨끗하고 가늘며 연결된 에지 픽셀 집합입니다.
threshold 매개변수는 두 요소 튜플 (low, high) 입니다. EDGE_CANNY 의 경우, high 값은 그 위에서 픽셀이 확실히 에지가 되는 컷오프이고, low 값은 그 위에서 픽셀이 확실한 에지에 연결되어 있을 때에만 에지가 되는 컷오프입니다. EDGE_SIMPLE 의 경우, high 값만 의미가 있으며, 이는 그 위에서 픽셀이 에지로 간주되는 단일 컷오프입니다. 기본값인 (100, 200) 은 특정 장면에 맞게 조정해 볼 만한 출발점입니다.
img.gaussian(1) # pre-smooth
img.find_edges(image.EDGE_CANNY, threshold=(50, 100))
Canny 검출기는 에지가 중요한 거의 모든 애플리케이션에서 더 나은 선택입니다. 더 빠른 EDGE_SIMPLE 은 Canny의 비용이 문제가 되고 그 히스테리시스의 노이즈 제거가 실제로 필요하지 않은 경우를 위해 기억해 둘 만합니다.
5.14.5. 가우시안에서의 적응형 임계값 적용¶
통계 필터 와 마찬가지로, gaussian() 은 적응형 임계값 적용을 위한 threshold=True / offset=N 키워드 쌍을 받습니다. 동작은 mean() 의 경우와 동일합니다: 각 위치에서의 가우시안 통계량이 지역 컷오프가 되고, 소스 픽셀이 그 통계량에 오프셋을 더한 값과 비교되어 이진 결과를 만들어 냅니다.
가우시안 변형은 입력이 어느 정도 노이즈가 없을 때 적응형 임계값 적용에 보통 가장 깔끔한 선택입니다. 가중 평균은 평균 필터가 만들어 내는 것보다 더 부드러운 컷오프를 제공하며, 가파른 조명 전이 지점에서 아티팩트가 더 적습니다.