Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java로 구현하는 탑햇(Top Hat)·블랙햇(Black Hat) 형태학적 연산 완벽 가이드

형태학적 연산(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();
}
}

입력 이미지

Java로 구현하는 탑햇(Top Hat)·블랙햇(Black Hat) 형태학적 연산 완벽 가이드

실행 결과

Java로 구현하는 탑햇(Top Hat)·블랙햇(Black Hat) 형태학적 연산 완벽 가이드

블랙햇(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();
}
}

입력 이미지

Java로 구현하는 탑햇(Top Hat)·블랙햇(Black Hat) 형태학적 연산 완벽 가이드

실행 결과

Java로 구현하는 탑햇(Top Hat)·블랙햇(Black Hat) 형태학적 연산 완벽 가이드

정리

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