코딩 및 기타/이미지

모폴로지 Morphology

정지홍 2025. 1. 16. 13:05

모폴로지 Morphology

  • 형태학 형상학이라고 한다.
  • 객체의 구조 or 형태에 대해서 수학적 이론(집합론적 방법)과 연산을 다룬다.
    • 주로 이미지 처리나 컴퓨터 비전에서 사용하며, 이미지에서 특정 형태나 구조를 추출 및 분석 할때 사용.
  • 핵심 개념
    • 구조 요소 structurung element
      • 이미지에서 연산을 수행할 때 기준이 되는 작은 형태의 객체이다. 
      • 이는 기본적인 연산인 erosion과 dilation을 수행할때, 입력이미지와 결합되어 동작한다.
      • 구조요소의 형태와 크기에 따라 연산 결과가 달라지니, 이를 적절히 선택해야함.
  • 주요 연산
    • 침식 erosion
      • 이미지에서 객체의 경계를 좁히는 연산이다.
      • 구조 요소가 이미지에서 객체를 탐색하며 그안에 포함된 픽셀만 남게된다.
        • 즉, 구조요소가 객체 내에서 완전히 겹쳐진 부분만 유지됨.
    • 팽창 dilation
      • erosion과 반대되는 연산이며, 객체의 크기를 확장하는 효과를 가져온다.
      • 구조 요소가 이미지에서 객체를 확장하는 방식으로 적용.
        즉, 구조 요소와 겹치는 부분에 대해서 해당 객체의 픽셀을 활성화...
        • 이로 인하여 객체가 확장되며, 작은 구명이 채워지면서 두 객체가 연결되는 효과도 나타난다.
        • ex) 배경이 어두운 이미지에서 객체가 확장되고 연결될 수 있음.
    • 개폐 open
      • erosion 적용후 dilation을 수향한다.
      • erosion으로 작은 객체 or 잡음 제거 후, dilation으로 큰 형태로 객체를 복원하는 방식
        • 이로 인해, 잡음을 제거하면서 중요한 형태를 유지함. 주로 작은 객체 제거 or 불필요한 부분 제거에 사용.
      • ex) 이미지 처리시 배경의 작은 잡음 제거 후, 주 객체를 강조하는데 사용
    • 닫힘 close
      • dilation으로 객체 확장 적용 후, erosion으로 원래 형태로 되돌리는 작업을 수행한다.
        • 이로 인해, 작은 구멍을 채우거나, 객체의 경계를 강화하여, 객체를 더 밀집시킬수있다.
      • ex) 작은 구멍이 있는 부분을 채워서 물체를 좀 더 밀도 있게 만들기.
    • 그라디언트 gradient
      • erosiondilation의 차이를 구하는 연산.
      • dilation - erosion 의 결과이며, 경계 부분이 강조 됨.
        • 이로 인해, 이미지에서 경계나 모서리를 강조해서 객체의 윤곽선을 뚜렷하게 함.
      • ex) 경계 강조 or 객체의 크기 변화를 분석
    • 홀 Top Hat
      • 원본 이미지 - open 을 하는 연산
      • 이미지에서 원본의 작은 구조적 변화를 추출할때 사용
        • 이로 인해, 이미지에서 작은 객체나 세부적인 구조를 추출하는데 유용
    • Black Hot
      • close - erosion 을 하는 연산으로, 어두운 부분이나 작은 물체의 세부 사항 강조
      • 작은 음영 차이나 구멍 강조 가능
  • 응용
    • 잡음 제거
    • 경계강조
    • 형태 분석
    • 객체 연결
    • 모서리 강조

 


침식 erosion

cv2.getStructuringElement( shape , ksize , anchor )
- shape은 구조화 요소 커널 모양 ( MORPH_RECT는 사각형 , MORPH_EPLIPSE는 타원형 , MORPH_CROSS는 십자형 
- ksize는 커널 크기
- anchor는 구조화 요소의 기준점. 이는 십자형에만 의미 있음
dst = cv2.erode( src , kernel , anchor , iterations , borderType , borderValue )
- src는 입력영상
- kernel은 구조화 요소 커널
- anchor는 getStructuringElement와 동일
- iteration는 참삭연산 적용 반복횟수이며 옵션
- bodertype 외곽 영역 보정 방법 option
- boderValue 외곽 영역 보정 값 옵션
import numpy as np
import cv2

img = cv2.imread('dot.jpg' )
k = cv2.getStructuringElement( cv2.MORPH_RECT , ( 3 , 3  ) )
erosion = cv2.erode( img , k )

merged = np.hstack( (img , erosion ) )
cv2.imshow('erode',merged)
cv2.waitKey(0)
cv2.destroyAllWindows()


팽창 dilation

 

img = cv2.imread('dot_hole.jpg' )
k = cv2.getStructuringElement( cv2.MORPH_RECT , ( 3, 3 ) )
dst = cv2.dilate( img , k )

merged = np.hstack( (img , dst ) )
cv2.imshow('dilation',merged)
cv2.waitKey(0)
cv2.destroyAllWindows()


개패 open

image = cv2.imread( 'dot.jpg' , cv2.IMREAD_GRAYSCALE )

_ , binary_img = cv2.threshold( image , 127 , 255 , cv2.THRESH_BINARY )

k = cv2.getStructuringElement( cv2.MORPH_RECT , ( 3 , 3 ) )

open_img = cv2.morphologyEx( binary_img , cv2.MORPH_OPEN , k )

cv2.imshow('origin' , binary_img )
cv2.imshow('opening' , open_img )
cv2.waitKey( 0 )
cv2.destroyAllWindows()


닫힘 close

image = cv2.imread( 'dot_hole.jpg' , cv2.IMREAD_GRAYSCALE )

_ , binary_img = cv2.threshold( image , 127 , 255 , cv2.THRESH_BINARY )

k = cv2.getStructuringElement( cv2.MORPH_ELLIPSE , ( 5 , 5 ) )

close_img = cv2.morphologyEx( binary_img , cv2.MORPH_CLOSE , k )

cv2.imshow('origin' , binary_img )
cv2.imshow('opening' , close_img )
cv2.waitKey( 0 )
cv2.destroyAllWindows()


gradient

image = cv2.imread( 'dot.jpg' , cv2.IMREAD_GRAYSCALE )

_ , binary_img = cv2.threshold( image , 127 , 255 , cv2.THRESH_BINARY )

k = cv2.getStructuringElement( cv2.MORPH_ELLIPSE , ( 5 , 5 ) )

close_img = cv2.morphologyEx( binary_img , cv2.MORPH_GRADIENT , k )

cv2.imshow('origin' , binary_img )
cv2.imshow('opening' , close_img )
cv2.waitKey( 0 )
cv2.destroyAllWindows()


tophat

image = cv2.imread( 'dot.jpg' , cv2.IMREAD_GRAYSCALE )

_ , binary_img = cv2.threshold( image , 127 , 255 , cv2.THRESH_BINARY )

k = cv2.getStructuringElement( cv2.MORPH_ELLIPSE , ( 5 , 5 ) )

close_img = cv2.morphologyEx( binary_img , cv2.MORPH_TOPHAT , k )

cv2.imshow('origin' , binary_img )
cv2.imshow('opening' , close_img )
cv2.waitKey( 0 )
cv2.destroyAllWindows()


blackhat

image = cv2.imread( 'dot.jpg' , cv2.IMREAD_GRAYSCALE )

k = cv2.getStructuringElement( cv2.MORPH_ELLIPSE , ( 5 , 5 ) )

close_img = cv2.morphologyEx( image , cv2.MORPH_BLACKHAT , k )

cv2.imshow('origin' , binary_img )
cv2.imshow('opening' , close_img )
cv2.waitKey( 0 )
cv2.destroyAllWindows()

 

 

 

 

 

import cv2
import numpy as np

image = cv2.imread('warehouse.jpg')
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

h , s , v = cv2.split( hsv_image )

edges = cv2.Canny( v , 50 , 150 )

kernel = cv2.getStructuringElement( cv2.MORPH_RECT  , ( 3 , 3 ) )
dilation_image = cv2.dilate( edges , kernel , iterations = 1 )
dilation_close_image = cv2.morphologyEx( dilation_image , cv2.MORPH_CLOSE , kernel )

cv2.imshow('Edges', edges )
cv2.imshow('dilation_image', dilation_image )
cv2.imshow('dilation_close_image', dilation_close_image )

cv2.waitKey(0)
cv2.destroyAllWindows()

 

RECT
ELLIPSE

 

'코딩 및 기타 > 이미지' 카테고리의 다른 글

VGG 16  (1) 2025.01.17
허프 변환(Hough Transformation)  (0) 2025.01.17
U-Net  (0) 2025.01.15
SURF (Speeded-Up Robust Features)  (0) 2025.01.14
SIFT (Scale-Invariant Feature Transform)  (1) 2025.01.13