형태학적 연산(Morphological Operations)이란?
형태학적 연산은 주어진 구조 요소(structuring element)의 형태를 기준으로 이미지를 처리하는 연산들의 집합입니다. 대표적인 형태학적 연산은 다음과 같습니다.
- 침식(Erosion) – 이미지 경계에서 픽셀을 제거하는 형태학적 연산입니다.
- 팽창(Dilation) – 이미지 경계에 픽셀을 추가하는 형태학적 연산입니다.
- 추가되거나 제거되는 픽셀의 개수는 사용된 구조 요소의 크기에 따라 결정됩니다.
- 모폴로지 열림(Opening) – 입력 이미지에 먼저 침식을 적용한 뒤, 그 결과에 팽창을 적용합니다. 이미지 전경(foreground)의 작은 객체를 제거할 때 사용됩니다.
- 모폴로지 닫힘(Closing) – 입력 이미지에 먼저 팽창을 적용한 뒤, 그 결과에 침식을 적용합니다. 이미지 내부의 작은 구멍이나 빈틈을 메울 때 사용됩니다.
탑햇(Top Hat) 변환이란?
모폴로지 탑햇(Top Hat)은 원본 이미지와 그 이미지에 열림(opening)을 적용한 결과 사이의 차이를 나타냅니다. 이 연산은 밝은 배경 속에 있는 작고 밝은 영역이나 세부 요소를 효과적으로 추출하는 데 활용됩니다.
예제 코드
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class TopHatExample {
public static void main(String args[]) {
// OpenCV 핵심 라이브러리 로드
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 이미지 데이터 읽기
String file = "D:\\Images\\morph_input1.jpg";
Mat src = Imgcodecs.imread(file);
// 출력 행렬 생성
Mat dst = new Mat(src.rows(), src.cols(), src.type());
// 커널(kernel) 행렬 객체 준비
Mat kernel = Mat.ones(5, 5, CvType.CV_32F);
// 이미지에 탑햇(Top Hat) 연산 적용
Imgproc.morphologyEx(src, dst, Imgproc.MORPH_TOPHAT, kernel);
// 결과 이미지 표시
HighGui.imshow("Tophat Result", dst);
HighGui.waitKey();
}
}
입력 이미지

실행 결과

블랙햇(Black Hat) 변환이란?
모폴로지 블랙햇(Black Hat)은 이미지에 닫힘(closing)을 적용한 결과와 원본 이미지 사이의 차이를 나타냅니다. 이 연산은 배경보다 어두운 작은 영역을 강조하거나 추출하는 데 유용합니다.
예제 코드
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class BlackHatExample {
public static void main(String args[]) {
// OpenCV 핵심 라이브러리 로드
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 이미지 데이터 읽기
String file = "D:\\Images\\morph_input1.jpg";
Mat src = Imgcodecs.imread(file);
// 출력 행렬 생성
Mat dst = new Mat(src.rows(), src.cols(), src.type());
// 커널(kernel) 행렬 객체 준비
Mat kernel = Mat.ones(5, 5, CvType.CV_32F);
// 이미지에 블랙햇(Black Hat) 연산 적용
Imgproc.morphologyEx(src, dst, Imgproc.MORPH_BLACKHAT, kernel);
// 결과 이미지 표시
HighGui.imshow("Blackhat Result", dst);
HighGui.waitKey();
}
}
입력 이미지

실행 결과

정리
두 연산 모두 OpenCV의 Imgproc.morphologyEx() 메서드 하나로 구현할 수 있으며, 탑햇은 MORPH_TOPHAT, 블랙햇은 MORPH_BLACKHAT 플래그를 지정하는 차이만 있습니다. 커널 크기를 조절하면 검출되는 영역의 크기도 함께 달라지므로, 처리하려는 이미지 특성에 맞게 구조 요소의 크기를 조정하는 것이 중요합니다.