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


'코딩 및 기타 > 이미지' 카테고리의 다른 글
| 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 |