모폴로지 연산 코드
침식(Erosion)과 팽창(Dilation) 코드
침식은 물체를 깎아내고, 팽창은 물체를 부풀리는 역할을 한다.
Mat image, erosion, dilation; // 이미지, 침식 결과, 팽창 결과를 저장할 변수
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(10, 10));
// 커널(구조화 요소)을 타원 모양으로 생성. 크기는 10x10
image = imread("water_coins.jpg", 0); // 이미지를 흑백으로 불러옴
threshold(image, image, 128, 255, THRESH_BINARY);
// 임계값을 사용해 이미지를 이진화 (128 이상은 흰색, 나머지는 검은색)
erode(image, erosion, element); // 침식 연산 적용 (물체를 깎아냄)
dilate(image, dilation, element); // 팽창 연산 적용 (물체를 부풀림)
imshow("Binary image", image); // 이진화된 이미지 출력
imshow("Erosion", erosion); // 침식된 이미지 출력
imshow("Dilation", dilation); // 팽창된 이미지 출력
waitKey(0); // 키 입력 대기
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(10, 10));는 모래성 만들 때 사용하는 작은 도구(모양 틀)를 생각해보라. 이 도구가 어떻게 생겼느냐에 따라 모래성의 모양이 달라지는데, 이 커널이 바로 그런 도구다.
erode(image, erosion, element);는 침식(Erosion) 연산이다. 커널을 이용해서 물체의 경계를 깎아내는 작업이다. 즉, 이미지에서 흰색 영역이 줄어드는 거다.
dilate(image, dilation, element);는 팽창(Dilation) 연산이다. 반대로 커널을 이용해서 물체를 부풀려서 경계를 확장하는 작업이다.
결과물을 보며 살펴보자
왼쪽은 원본 이진화 이미지다. 이 상태에서 침식과 팽창 연산을 적용하면, 이미지의 모양이 어떻게 변하는지 확인할 수 있다.
하얀색이 물체다.
가운데는 침식(Erosion) 연산을 적용한 결과다. 검은 부분이 커진 것을 보면 물체가 많이 깎인 것을 확인할 수 있다.
다시 말하지만 하얀색이 물체다 ㅋㅋ
맨 오른쪽은 팽창(Dilation) 연산을 적용한 결과다. 결과적으로 물체들이 부풀어오른 것처럼 커졌고, 흰색 영역이 더 넓어졌다. 물체들이 서로 이어진 부분도 생겼다.
열림(Opening)과 닫힘(Closing) 코드를 살펴보자
열림은 침식 후 팽창, 닫힘은 팽창 후 침식을 의미한다.
점점 커지는거랑 점점 작아지는 것 생각하면 된다.
Mat image, opening, closing, element; // 필요한 변수 선언
image = imread("water_coins.jpg", 0); // 이미지를 흑백으로 불러옴
threshold(image, image, 128, 255, THRESH_BINARY);
// 임계값을 사용해 이미지를 이진화
element = getStructuringElement(MORPH_ELLIPSE, Size(7, 7));
// 타원 모양의 커널을 7x7 크기로 생성
morphologyEx(image, closing, MORPH_CLOSE, element);
// 닫힘 연산 적용 (팽창 후 침식)
morphologyEx(image, opening, MORPH_OPEN, element);
// 열림 연산 적용 (침식 후 팽창)
imshow("Binary image", image); // 이진화된 이미지 출력
imshow("opening", opening); // 열림 연산 결과 출력
imshow("closing", closing); // 닫힘 연산 결과 출력
waitKey(0); // 키 입력 대기
morphologyEx(image, closing, MORPH_CLOSE, element);은 주로 작은 구멍을 메우거나 물체의 경계를 매끄럽게 만들 때 사용한다.
morphologyEx(image, opening, MORPH_OPEN, element);은 침식 후 팽창을 적용해서 주로 작은 잡음을 제거하거나, 물체 사이의 얇은 선을 없애는 데 사용한다.
열림과 닫힘의 차이를 요약하자면
열림(Opening): 침식 후 팽창 → 작은 잡음 제거에 유용.
닫힘(Closing): 팽창 후 침식 → 구멍이나 틈을 메우는 데 유용.
결과를 보면서 비교해보자
왼쪽은 원본
하얀색이 물체다.
가운데는 Opening이 적용된거다. 작은 연결부나 잡음이 사라지고, 물체들의 크기가 약간 줄어든 모습을 볼 수 있다.
특히 물체 사이의 작은 부분들이 사라지면서, 물체들이 좀 더 깔끔하게 분리된 걸 볼 수 있다.
오른쪽은 Closing이 적용된거다. 물체의 경계가 확장된 후에 다시 깎여 나가면서, 물체가 뭉쳐진 모습처럼 보이게 된다.
사실 나는 차이가 잘 안느껴진다 Closing 사진은 ㅋㅋ