본문 바로가기

PyImageSearch

OpenCV - Morphological Operations(형태학적 연산)

Morphological operations

 

 

Binary image(0,255로만 이루어진 이미지), Grayscale image(0~255) 적용가능,

다중채널이미지는 채널별로 적용해서 합치기 가능

 

1. Erosion : cv2.erode(src, kernel,  iterations)

객체(전경)의 픽셀 값을 커널이 덮는 영역 내의 최솟값으로 대체하여, 객체를 “축소” 

사용 : 잡음 제거, 경계 영역 축소, 객체 분리(겹쳐져 있는 사물을 객체별로 분리)

eroded = cv2.erode(gray.copy(), None, iterations=1) eroded = cv2.erode(gray.copy(), None, iterations=2) eroded = cv2.erode(gray.copy(), None, iterations=3)

  • src : 입력 이미지
  • kernel : 이미지의 각 픽셀 위치에서의 "이웃 픽셀 집합"
    • 모양
      • 사각형(default) : 객체의 네 모서리와 가장자리가 고르게 축소됨
        kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
      • 원형 : 코너(모서리) 부분은 덜 깎이고, 곡면 모양 객체를 남기는 데 유리
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
      • 십자형 : 가로·세로 연결만 축소하므로 세밀한 구조 보존에 유리
        kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5))
    • 크기
      • 크기가 클 수록 한번에 깎여나가는 픽셀 폭이 커진다(더 뭉뚱그려진다)
      • 작은 노이즈 제거용이라면 3×3(default), 객체 경계만 살짝 다듬고 싶다면 5×5 이상을 선택
        # 작은 노이즈 제거: 3×3 사각
        kernel_small = np.ones((3,3), np.uint8)
        # 좀 더 공격적인 침식: 7×7 사각
        kernel_large = np.ones((7,7), np.uint8)

iterations : 침식 연산 반복 횟수(반복할수록 객체가 더 많이 축소됨)
------------------------------------------------------------------------------------------------------------------------------
* anchor : kernel내 기준점(중앙(-1,-1)이 기본값)
* borderType : 가장자리 픽셀 처리 방식 (BORDER_CONSTANT, BORDER_REPLICATE 등)
* borderValue : bordertype이 BORDER_CONSTANT일 때 채울 값

 

2. Dilation : cv2.dilate(src, kernel,  iterations)

커널이 덮는 영역 내에서 최댓값을 결과 픽셀로 대체하여, 전경 픽셀을 주변으로 확장

사용 : 노이즈 제거, 객체 연결, 빈틈 메우기, 윤곽강조, 마스크 확장

dilated = cv2.dilate(gray.copy(), None, iterations=1) dilated = cv2.dilate(gray.copy(), None, iterations=2) dilated = cv2.dilate(gray.copy(), None, iterations=3)

 

3. opening

침식(Erosion)팽창(Dilation) 을 순차적으로 적용하는 모폴로지 연산입니다.
사용 : 작은 노이즈를 제거, 객체를 분리 하면서 원본 객체의 형태를 크게 훼손하지 않는 데 유용합니다.

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernelSize)
    opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)

 

opening : kernel size (3,3), (5,5), (7,7)

 

4. closing

팽창(Dilation)침식(Erosion) 을 순차적으로 적용하는 모폴로지 연산입니다.
사용 : 작은 구멍(hole)이나 어두운 점(noise)을 메우면서 객체의 전체 형태를 크게 훼손하지 않는 데 유용합니다.

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernelSize)
    closing = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)

closing : kernel size (3,3), (5,5), (7,7)

 

5. Morphological Gradient

팽창(Dilation)침식(Erosion) 의 차이를 계산하여 객체의 경계(에지)를 강조

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernelSize)
    gradient = cv2.morphologyEx(gray, cv2.MORPH_GRADIENT, kernel)

morphological gradient : kernel size (3,3), (5,5), (7,7)

 

6. Top-Hat (White-Hat) / Black-Hat

 

 

# 인식이 필요한 부분의 크기에 맞게 kernel 설정
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))
 
blackhat = cv2.morphologyEx(gray, cv2.MORPH_BLACKHAT, rectKernel)
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel)
  • White-Hat
    • 어두운 배경에서 밝은 부분 강조
    • 사용 : 문서 스캔에서 흰 바탕 위의 작은 얼룩 제거 전 강조, 조명 그림자가 있는 사진에서 밝은 반점 추출
  • Black-Hat
    • 밝은 배경에서 어두운 부분 강조
    • 사용 : 금속 표면 검사에서 흠집(어두운 부분) 검출, 혈관 영상에서 어두운 선만 분리

출처

https://www.pyimagesearch.com/2021/04/28/opencv-morphological-operations/?_ga=2.9524981.1773329974.1749613563-254784589.1749433426

 

OpenCV Morphological Operations - PyImageSearch

In this tutorial, you will learn about applying morphological operations with OpenCV. The morphological operations we’ll be covering include: Erosion Dilation Opening Closing Morphological gradient Black hat Top hat (also called “White hat”) These im

pyimagesearch.com

 

'PyImageSearch' 카테고리의 다른 글

OpenCV - Thresholding(이진화)  (0) 2025.06.12
OpenCV - Color Spaces  (0) 2025.06.12
OpenCV - 블러처리  (2) 2025.06.12
OpenCV : 기본함수들  (0) 2025.06.09
CommandLine Arguments  (2) 2025.06.03