영상처리/OpenCV

모폴로지 연산

성혜영 2022. 6. 8. 14:24

모폴로지 연산

모폴로지 변환의 팽창(dilation)과 침식(erosion)을 기본 연산을 사용해 고급 형태학을 적용하는 변환 연산. 입력 이미지가 이진화된 이미지라면 침식/연산 으로도 충분, 그레이 스케일이나 다중 채널 이미지를 사용하는 경우 사용.

 

# 모폴로지 연산 함수

dst = cv2.morphologyEx(

    src,

    op,

    kernel,

    anchor=None,

    iterations=None,

    borderType=None,

    borderValue=None

)

 

모폴로지 연산은 모폴로지 변환에 기반을 두고 있기 때문에 매개변수가 거의 동일. > 연산자(op)라는 매개변수를 추가로 받음. 모폴로지 변환 함 수를 수행하는 복합 연산 방식 의미. 연산 함수는 연산자 플래그에서 팽창/침식을 지원하므로 따로 사용하지 않고도 변환 가능. 총 여덟가지의 연산자 지원.

 

모폴로지 연산자 (팽창/침식 제외)

 

* 열림 연산

  1. 팽창과 침식 연산자의 조합이며, 침식 연산을 적용한 다음, 팽창 연산을 적용.
  2. 어두운 영역 및 밝은 영역의 조정으로 스펙클이 사라지며 발생한 객체의 크기 감소를 원상태로 복구 가능. 
  3. dst = deliate(erode(src))

 

* 닫힘 연산

  1. 팽창과 침식 연산자의 조합이며, 팽창 연산을 적용한 다음, 침식 연산을 적용.
  2. 어두운 영역 및 밝은 영역의 조정으로 스펙클이 사라지며 발생한 객체의 크기 감소를 원상태로 복구 가능. 
  3. dst = erode(dilate(src))

 

* 그레이디언트 연산

  1. 팽창과 침식 연산자의 조합이며, 입력 이미지에 각각 팽창 연산과 침식 연산을 적용하고 감산 진행. 
  2. 팽창과 침식의 결과를 감산한다면 객체의 가장자리가 반환.
  3. 밝은영역의 가장자리를 분리하며 그레이스케일 이미지가 가장 급격하게 변하는 곳에서 가장 높은 결과 반환.
  4. dst = dilate(src) - erode(src)

 

* 탑햇 연산

  1. 팽창과 침식 연산자의 조합이며, 입력 이미지에 열림 연산을 적용한 이미지를 감산. 
  2. 열림 연산이 적용된 이미지는 스펙클이 사라지고 객체의 크기가 보존.
  3. 이 결과를 감산하면 밝은 영역이 분리되어 사라졌던 스펙클이나 작은 부분들이 표시.
  4. 입력 이미지에 객체들이 제외되고 국소적으로 밝았던 부분들이 분리.
  5. 즉, 열림 연산에서 사라질 요소들을 표시.
  6. dst = src - open(src)

 

* 블랙햇 연산

  1. 팽창과 침식 연산자의 조합이며, 닫힘 연산을 적용한 이미지에 입력 이미지 감산.
  2. 닫힘 연산이 적용된 이미지는 객체 내부의 홀이 사라지고 객체의 크기가 보존된 결과.
  3. 이 결과를 감산하면 어두운 영역이 채워져 사라졌던 홀 등이 표시.
  4. 입력 이미지의 객체들이 제외되고 국소적으로 어두웠던 홀들이 분리.
  5. 즉, 닫힘 연산에서 사라질 요소들을 표시.
  6. dst = close(src) - src

 

* 히트미스 연산

  1. 단일 채널 이미지에서 활용하며, 주로 이진화 이미지에 적용.
  2. 이미지의 전경이나 배경 픽셀의 특정 패턴을 찾는데 사용하는 이진 형태학
  3. 히트미스에서의 커널은 기존과 다른 역할 (0 : 해당 픽셀을 고려하지 않음 / 1 : 해당 요소를 유지)
  4. 모서리(corner) 검출하는 데 활용

 

 

 

# 모폴로지 히트미스

import numpy as np

import cv2



src = cv2.imread("Chapter6/Example-06-12-Py/dandelion.jpg", cv2.IMREAD_GRAYSCALE)

_, binary = cv2.threshold(src, 127, 255, cv2.THRESH_BINARY)



kernel = np.array([[1, 0, 0, 0, 1],

                   [0, 1, 0, 1, 0],

                   [0, 0, 1, 0, 0],

                   [0, 1, 0, 1, 0],

                   [1, 0, 0, 0, 1]])



dst = cv2.morphologyEx(binary, cv2.MORPH_HITMISS, kernel, iterations=1)



cv2.imshow("dst", dst)

cv2.waitKey(0)

cv2.destroyAllWindows()



ndarray 클래스에 임의의 구조 요소를 생성해 모폴로지 연산 함수에 히트미스 플래그를 적용. 커널의 크기는 5x5이고, X형태로 1의 요소를 할당해 x 형태의 픽셀만 유지되도록 구성.