컴퓨터 비전/openCV

[openCV] Morphological Operations in Images

kdjames0930 2025. 12. 13. 16:09

모폴로지 연산(Morphological Operation)은 이미지 프로세싱의 한 가지 방법으로 이미지를 형태(shape) 관점에서 변형, 분석하며 주로 바이너리 이미지에 활용된다. 모폴로지 연산을 통해 노이즈 제거, 엣지 변형, 객체의 형태 분석 등을 해낼 수 있다. 

 

연산의 종류로는 Erosion(침식), Dilation(팽창), Gradient, Opening, Closing 이 있다. 

 

  • Erosion

이미지를 커널이 스캔하고, 커널의 모든 영역이 이미지의 객체 내부에 포함될 때 (교집합) 커널의 중심점의 집합이 Erosion의 결과가 된다. Erosion을 통해 커널보다 크기가 작은 white noise를 제거하거나 객체의 경계를 후퇴시킬 수 있다. 

 

  • Dilation

이미지를 커널이 스캔하고, 커널의 일부 영역이 이미지의 객체 내부에 포함될 때 (합집합) 커널의 중심점의 집합이 Dilation의 결과가 된다. Dilation을 통해 객체를 확장시키거나 객체 내부의 구멍을 매울 수 있다. 

 

img = cv2.imread("/content/drive/MyDrive/Dataset/opencv/Screenshot20220304172134-660x558.jpg", 0)
ret, bin = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY_INV)

# kernel = np.ones((5, 5), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

# Erosion and Dilation
img_erosion = cv2.erode(bin, kernel, iterations=1)
img_dilation = cv2.dilate(bin, kernel, iterations=1)

 

cv2.getStructuringElement을 통해 다양한 형태의 커널을 만들 수 있다. 직사각형 모양, 타원형, 심자가형 등이 있다. 

 

Erosion, Dilation 연산 결과

 

 5x5 직사각형 형태의 커널이 이미지 전체를 스캔하며 Erosion에서는 커널의 전체 영역이 알파벳(하얀 부분)에 포함된 경우의 중심점들이 하얀색으로 남았고, Dilation에서는 커널의 한 픽셀이라도 알파벳과 겹친 경우 중심점이 하얀색이 되었다. Erosion에서는 알파벳들이 가늘어지고 Dilation의 결과 알파벳들이 두꺼워졌다. 

 

  • Gradient

Gradient는 "같은 이미지에 Dilation과 Erosion을 적용했을 때의 차이" 이다. 객체의 윤곽선 부분이 강조된다.

# gradient: difference between erosion and dilation
gradient = cv2.morphologyEx(bin, cv2.MORPH_GRADIENT, kernel)

 

Gradient 연산 결과

 

  • Opening

Opening 은 이미지에 Erosion 후 Dilation을 적용하는 것이다. 이미지의 작은 노이즈는 제거하고 엣지를 부드럽게 하면서 기존의 객체 크기는 유지한다. 떨어져 있어야 하는 두 객체가 원본 이미지에서 붙어 있을 때 분리하는 식으로 활용할 수도 있다. 

 

출처: openCV Documentation

 

위와 같이 작은 노이즈를 제거하면서 객체의 크기를 거의 유지할 수 있다.

opened = cv2.morphologyEx(bin, cv2.MORPH_OPEN, kernel)

Opening 연산 결과

 

  • Closing

Closing 은 이미지에 Dilation 후 Erosion을 적용하는 것이다. 이미지의 객체 내부에 존재하는 작은 구멍을 매우고 가까운 객체를 연결시킨다. 

 

출처: openCV Documentation

 

위와 같이 객체 내부의 작은 구멍들을 매우는 동시에 객체의 크기를 거의 유지할 수 있다. 

 

closed = cv2.morphologyEx(bin, cv2.MORPH_CLOSE, kernel)

Closing 연산 결과

 

 

이외에도 원본 이미지에서 Opening을 뺀 값인 Top-hat, Closing에서 원본 이미지를 뺀 값인 Black-hat 등이 있다.

  • Top-hat: 밝고 작은 객체 강조, Original Image - Opening
  • Black-hat: 어둡고 작은 객체 강조, Closing - Original Image

 

 

 

 

반응형