Morphological transformations
Peponi │ 5/14/2025 │ 7m
Morphological transformations
Peponi
1. Introduction
Morphological transformation은 커널을 이용하여 이미지의 기하학적인 구조를 분석, 조작하는 기법이다. 보통 이진화된 이미지에 수행하며 사각, 십자가 등의 모양을 가진 커널을 이미지 위에서 이동시키면서 엣지를 깎아내거나 확장하는 등의 연산을 할 수 있다. Erosion
, Dilation
이 기본적인 morphological transformation 연산이며, 이를 응용한 여러 연산 방법이 있다.
이 문서에서는 다음 연산 방법에 대해 알아본다.
- Erosion
이미지의 밝은 영역 (전경) 을 줄어들게 만든다. 노이즈를 제거하거나 붙어 있는 객체를 떨어뜨리는 등에 사용된다. - Dilation
이미지의 전경을 팽창시킨다. 끊어진 객체를 연결하거나 구멍을 메울 때 등에 사용된다. - Opening
Erosion 후 Dilation을 수행한다. 객체의 모양과 크기를 유지하면서 노이즈를 제거할 수 있다. - Closing
Dilation 후 Erosion을 수행한다. 객체의 내부를 채우면서 끊어진 부분을 이어주는 효과를 얻을 수 있다. - Gradient
Dilation - Erosion을 수행한다. 객체의 엣지가 강조되는 효과를 얻을 수 있다. - TopHat
Original - Opening을 수행한다. 작고 밝은 객체를 찾아내거나 밝기 조정 효과 등을 얻을 수 있다. - BlackHat
Closing - Original (원본 이미지) 을 수행한다. 어두운 객체를 찾아내거나 음영을 제거하는 등에 사용할 수 있다.
실습에 사용할 이미지는 다음과 같다.



2. Erosion
Erosion은 이미지의 전경을 줄어들게 만든다. 커널 가 이미지 의 모든 원소를 순회하며, 각 위치에서 커널과 이미지의 모든 원소가 동일한 경우 1을, 아닌 경우 0을 출력하게 된다. 이를 수식으로 표현하면 다음과 같이 나타낼 수 있다.
private void Erosion(Mat image)
{
using var kernel = Mat.Ones(3, 3, MatType.CV_8UC1);
using var erode = image.Erode(kernel, iterations: 2);
// 또는 다음 메서드 사용
// using var erode = image.MorphologyEx(MorphTypes.Erode, kernel);
}
3. Dilation
Dilation은 이미지의 전경을 팽창시킨다. 커널 가 이미지 의 모든 원소를 순회하며, 각 위치에서 커널과 이미지의 일부 원소가 동일한 경우 1을, 아닌 경우 0을 출력하게 된다. 이를 수식으로 표현하면 다음과 같이 나타낼 수 있다.
private void Dilation(Mat image)
{
using var kernel = Mat.Ones(3, 3, MatType.CV_8UC1);
using var dilate = image.Dilate(kernel, iterations: 2);
// 또는 다음 메서드 사용
// using var dilate = image.MorphologyEx(MorphTypes.Dilate, kernel);
}
4. Opening
Opening 연산은 erosion 후 dilation을 수행한다. 이미지 내 객체의 형태를 보존하면서 노이즈, 요철 등을 깔끔하게 만드는 데 효과적인 방법으로, 이미지 전처리에 많이 사용된다.
private void MorphologyEx(Mat image)
{
using var kernel = Mat.Ones(3, 3, MatType.CV_8UC1);
using var transformed = image.MorphologyEx(MorphTypes.Open, kernel, iterations: 2);
}
5. Closing
Opening 연산은 dilation 후 erosion을 수행한다. 이미지의 작은 구멍을 메우면서 인접 객체를 연결하는 특징을 가지고 있으며, 어두운 노이즈를 제거하는 데 유용한 방법이다.
private void MorphologyEx(Mat image)
{
using var kernel = Mat.Ones(3, 3, MatType.CV_8UC1);
using var transformed = image.MorphologyEx(MorphTypes.Close, kernel, iterations: 2);
}
6. Gradient
Gradient 연산은 dilation - erosion을 수행한다. Dilation으로 커진 객체와 erosion으로 작아진 객체의 차를 구함으로써 객체의 경계 부분만 남게 되어 간단하게 엣지를 검출하는 데 사용된다.
private void MorphologyEx(Mat image)
{
using var kernel = Mat.Ones(3, 3, MatType.CV_8UC1);
using var transformed = image.MorphologyEx(MorphTypes.Gradient, kernel, iterations: 2);
}
7. TopHat
TopHat 연산은 원본 이미지 - opening을 수행한다. Opening으로 인해 사라진 부분이 결과로 나타나며, 커널 대비 작고 밝은 부분만 강조되어 출력된다.
private void MorphologyEx(Mat grayscale)
{
using var kernel = Mat.Ones(3, 3, MatType.CV_8UC1);
using var transformed = grayscale.MorphologyEx(MorphTypes.TopHat, kernel, iterations: 2);
}
8. BlackHat
BlackHat 연산은 closing - 원본 이미지를 수행한다. Closing으로 인해 메워진 부분이 결과로 나타나며, 커널 대비 작고 어두운 부분만 강조되어 출력된다. 어두운 결함을 찾는 비전 검사, OCR, 의료 영상 등에 사용된다.
private void MorphologyEx(Mat grayscale)
{
using var kernel = Mat.Ones(3, 3, MatType.CV_8UC1);
using var transformed = grayscale.MorphologyEx(MorphTypes.BlackHat, kernel, iterations: 2);
}