opencv c++ 모폴로지(Morphology) 기법을 이용하여 물체를 명확하게 보기

  • 최초 작성일: 2022년 1월 13일(목)

목차

[TOC]


목표

이번에는 모폴로지 기법을 이용해 물체를 더욱 더 명확하게 만드는 작업을 해볼 건데,

모폴로지(Morphology)란 ‘형태학’을 뜻한다. 다시 말해 영상 분야에서 노이즈 제거, 구멍 채우기, 끊어진 선 이어 붙이기 등의 형태학적 연산을 의미한다.

모폴로지 연산은 흑백으로 구성되어 있는 Binary(이진) 이미지에 적용시킬 수 있기 때문에 시작 전에 GrayScaling을 시행해주어야 한다.

모폴로지 연산에도 여러가지 종류가 있는데, Erosion(침식), Deilatation(팽창), Opening(열림), Closing(닫힘) 등이 있다.


침식 연산(Erosion)은 말 그대로 형태(이미지)를 깎아내는 것을 의미한다. 이를 위해선, 구조화 요소 커널(structuring element kernel)이 필요하며, 이것은 1이 채워진 모양에 따라 여러 모양으로 사용될 수 있다. (사각형, 십자형, 타원형 등)

침식 연산은



실습

우선, erode() 함수에 대해서 알아보자.

erode(src, dst, kernel, anchor, iteration, borderType, borderValue)

  • src: 입력 이미지 (Grayscaled)
  • dst: 출력 이미지
  • kernel: 침식연산을 위한 mask 크기를 포함한 정보 행렬
  • anchor: 변경될 픽셀의 위치 (굳이 건들지 않아도됌). Point(-1,-1) 사용 -> 중앙 의미
  • iteration: 반복 횟수
  • borderType: 이미지 테두리 경계 밖의 가상 픽셀 처리 방법
  • borderValue: 굳이 사용 x


침식 연산 (Erode)

그럼 우선, 침식(erode) 연산이 어떤 것인지 알아보자.

침식 연산은 내가 커널 정보를 (3, 3)으로 했다라고 가정하면, 3x3 매트릭스 마다 가장 최솟값을 중앙값으로 설정하는 것이 기본 원리이다.

아래의 이미지처럼 픽셀을 가진 이미지에 침식 연산 한다고 생각해보자.

image


내가 설정한 커널 정보에 따라 3x3 크기마다 최솟값을 중앙값으로 설정해준다.

image image

이 과정을 반복하면, 아래의 결과가 된다.

image

팽창 연산 (Dilate)

다음으로, 팽창 (dilate) 연산이 어떤 것인지 알아보자.

팽창 연산은 침식 연산과 반대로, 내가 커널 정보를 (3, 3)으로 했다라고 가정하면, 3x3 매트릭스 마다 가장 최댓값을 중앙값으로 설정하는 것이 기본 원리이다.

위에서 침식 연산한 매트릭스에서 다시 팽창 연산을 해보자.

image

내가 설정한 커널 정보에 따라 3x3 크기마다 최댓값을 중앙값으로 설정해준다.

image image

이 과정을 반복하면, 아래의 결과가 된다.

image


소스 코드

#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
	Mat img = imread("doctor.png", 0);	// grayscale image

	Mat img_dilate;
	Mat img_erode;
	
	Mat img_threshold;

	threshold(img, img_threshold, 180, 255, THRESH_BINARY);

	dilate(img_threshold, img_dilate, Mat::ones(Size(3, 3), CV_8UC1), Point(-1, -1));
	erode(img_threshold, img_erode, Mat::ones(Size(3, 3), CV_8UC1), Point(-1, -1));

	imshow("original", img_threshold);

	imshow("img_dilate", img_dilate);
	imshow("img_erode", img_erode);
	
	waitKey(0);

	return 0;
}


결과

코드를 직접 실행해보면,

침식 연산 (erode)은 원본 이미지에서 흰색 부분이 줄어든 결과를 보이고,

팽창 연산 (dilate)은 원본 이미지에서 흰색 부분이 늘어난 결과를 보였다.

image

image