모폴로지 목차
모폴로지
Erosion
모폴로지 Morphology
보통 바이너리 이미지에서 흰색으로 나타내지는 오브젝트 영역의 형태를 개선하기 위해 사용됨.
OpenCV에서 제공하는 연산함수 Erosion
, Dilation
, Opening
, Closing
- 바이너리 이미지에서 흰색 오브젝트의 외곽 픽셀을 0 (검은색) 으로 만듦.
- 노이즈(작은 흰색 물체) 를 제거
- 붙어 있는 오브젝트들을 분리하는 데 사용 가능
- 사용한 커널의 크기에 따라 오브젝트 외곽에서 0이 되는 픽셀의 정도가 달라짐
- 커널의 크기를 특정 크기로 고정하고 Erosion 반복 횟수를 증가시켜서도, 오브 젝트 외곽에서 0이 되는 픽셀의 정도를 조절 가능
함수 원형
[모폴로지 구조 요소(커널) 생성 함수]
크기와 모양을 설정하고 고정점 위치도 임의대로 결정 가능
cv2.getStructuringElement(shape, ksize, anchor=None) -> retval
- shape: 구조 요소 모양을 나타내는 플래그
- cv2.MORPH_RECT : 사각형 모양
- cv2.MORPH_CROSS : 십자가 모양
- cv2.MORPH_ELLIPSE : 사각형에 내접하는 타원 모양
- ksize: 구조 요소 크기. (width, height) 튜플.
- anchor: MORPH_CROSS 모양의 구조 요소에서 고정점 좌표. (-1, -1)을 지정하면 구조 요소의 중앙을 고정점으로 사용.
- retval: 0과 1로 구성된 cv2.CV_8UC1 타입 행렬. numpy.ndarray. (1의 위치가 구조 요소 모양을 결정.)
[모폴로지 침식 연산 함수]
cv2.erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None) -> dst
- src: 입력 영상
- kernel: 구조 요소. getStructuringElement() 함수에 의해 생성 가능. 만약 None을 지정하면 3x3 사각형 구성 요소를 사용.
- dst: 출력 영상. src와 동일한 크기와 타입
- anchor: 고정점 위치. 기본값 (-1, -1)을 사용하면 중앙점을 사용.
- iterations: 반복 횟수. 침식 연산을 얼마나 반복할 것인지, 기본값은 1
- borderType: 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
- borderValue: cv2.BORDER_CONSTANT인 경우, 확장된 가장자리 픽셀을 채울 값
(원본)
(3,3)
(5,5)
코드
[C++]
# include < opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img_gray;
img_gray = imread("test.png", IMREAD_GRAYSCALE);
Mat kernel = getStructuringElement( MORPH_RECT, Size( 3, 3 ) );
Mat img_result;
erode(img_gray, img_result, kernel, Point(-1, - 1), 1);
imshow("Input", img_gray);
imshow("Result", img_result);
waitKey(0);
return 0;
}
[Python]
import cv2
import numpy as np
img_gray = cv2.imread('test.png', cv2.IMREAD_GRAYSCALE)
kernel = cv2.getStructuringElement( cv2.MORPH_RECT, ( 3, 3 ) );
img_result = cv2.erode(img_gray, kernel, iterations = 1)
cv2.imshow("Input", img_gray)
cv2.imshow("Result", img_result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Dilation
Erosion과 반대로 동작
바이너리 이미지에서 흰색 오브젝트의 외곽 픽셀 주변에 1 (흰색) 으로 추가함
노이즈 (작은 흰색 오브젝트) 를 없애기 위해 사용한 Erosion에 의해서 작아졌던 오브젝트를
- 원래대로 돌리거나
- 인접해 있는 오브젝트들을 연결하여 하나로 만드는 데 사용합
- 사용한 커널의 크기에 따라 오브젝트 외곽에서 1이 되는 픽셀의 정도가 달라짐
함수 원형
[모폴로지 팽창 연산 함수]
cv2.dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None) -> dst
- src: 입력 영상
- kernel: 구조 요소. getStructuringElement() 함수에 의해 생성 가능. 만약 None을 지정하면 3x3 사각형 구성 요소를 사용.
- dst: 출력 영상. src와 동일한 크기와 타입
- anchor: 고정점 위치. 기본값 (-1, -1)을 사용하면 중앙점을 사용.
- iterations: 반복 횟수. 기본값은 1.
- borderType: 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
- borderValue: cv2.BORDER_CONSTANT인 경우, 확장된 가장자리 픽셀을 채울 값
(원본) (3,3) (5,5)
코드
[C++]
# include < opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img_gray;
img_gray = imread("test.png", IMREAD_GRAYSCALE);
Mat kernel = getStructuringElement( MORPH_RECT, Size( 3, 3 ) );
Mat img_result;
dilate(img_gray, img_result, kernel, Point(-1, - 1), 1);
imshow("Input", img_gray);
imshow("Result", img_result);
waitKey(0);
return 0;
}
[Python]
import cv2
import numpy as np
img_gray = cv2.imread('test.png', cv2.IMREAD_GRAYSCALE)
kernel = cv2.getStructuringElement( cv2.MORPH_RECT, ( 3, 3 ) )
img_result = cv2.dilate(img_gray, kernel, iterations = 1)
cv2.imshow("Input", img_gray)
cv2.imshow("Result", img_result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Opening
Erosion 다음에 Dilation을 적용 -> 이미지 상의 노이즈 (작은 흰색 물체) 를 제거하는 데 사용하는 방법
1) Erosion을 사용하면 노이즈 (작은 흰색 오브젝트) 가 없어지는데 같이 흰색 오브젝트도 작아짐
2) 다시 Dilation를 적용하면 흰색 오브젝트가 원래 크기로 돌아옴
함수 원형
[범용 모폴로지 연산 함수]
침식과 팽창, 열기와 닫기 그 외에도 모폴로지 그래디언트를 지원
cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None) -> dst
- src: 입력 영상
- op: 모폴로지 연산 플래그
- cv2.MORPH_ERODE: 침식
- cv2.MORPH_DILATE: 팽창
- cv2.MORPH_OPEN: 열기
- cv2.MORPH_CLOSE: 닫기
- cv2.MORPH_GRADIENT: 모폴로지 그래디언트 = 팽창 - 침식
- kernel: 커널
- dst: 출력 영상
코드
[C++]
# include < opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img_gray;
img_gray = imread("test2.png", IMREAD_GRAYSCALE);
Mat kernel = getStructuringElement( MORPH_RECT, Size( 3, 3 ) );
Mat img_result;
morphologyEx(img_gray, img_result, MORPH_OPEN, kernel);
imshow("Input", img_gray);
imshow("Result", img_result);
waitKey(0);
return 0;
}
[Python]
import cv2
import numpy as np
img_gray = cv2.imread('test2.png', cv2.IMREAD_GRAYSCALE)
kernel = cv2.getStructuringElement( cv2.MORPH_RECT, ( 3, 3 ) )
img_result = cv2.morphologyEx(img_gray, cv2.MORPH_OPEN, kernel)
cv2.imshow("Input", img_gray)
cv2.imshow("Result", img_result)
cv2.waitKey(0)
cv2.destroyAllWindows()