본문 바로가기
개발 이야기/머신러닝, 딥러닝

[딥러닝 첫걸음] OpenCV - dilate, erode (수학적 형태학) 쉽게 이해하고 넘어가기

by AI 동키 2021. 3. 11.
반응형

내가 목표로 하고 있는 문자열이 pytesseract로 읽히지 않았다.
아마 글자가 겹쳐져 보여서 이거나 이미지가 작아서 이거나..

이미지를 기계가 읽기 좋게 변환을 해야 하는데,
여러가지 방법들이 있겠지만 첫번째로 찾게 된것은 OpenCV가 제공하는 dilate와 erode 기능이었다.

무슨 뜻인지 확실히 이해하고, 어떤 기능을 할지, 내 연구에는 도움을 줄지 알아보자. 

 

간간히 어려운 내용이 나오는데 넘어가길 바란다.
그 뒤에 아주 쉽게 설명 해 놓을 거니까. 

 

 

수학적 형태학 (대충 뭔지 알고만가자)

수학적 형태학(영어: Mathematical morphology, MM)은 집합론, 격자론, 위상수학, 그리고 무작위 함수에 기반한 기하학적 구조를 분석하고 처리하는 이론과 기술이다. MM은 대부분 디지털 이미지에 적용되지만, 그래프, 폴리곤 메시, 솔리드, 그리고 많은 공간 구조에도 적용할 수 있다.

크기, 모양, 볼록성, 연결성, 그리고 지오데식 거리같은 위상수학적 그리고 기하학 연속공간 개념은 MM에 의해서 연속 공간과 이산 공간 모두에 소개되었다. MM은 또한 이미지를 위의 특성화에 따르도록 이미지를 바꾸는 연산의 집합으로 이루어진 형태학적 디지털 화상 처리의 근본이다.

기본 형태학적 연산은 침식, 팽창, 열기 닫기가 있다.

MM은 원래 이진 이미지를 위해서 만들어졌고, 나중에 회색조 함수와 이미지로 확장되었다. 잇따라 나온 완비 격자로의 일반화는 오늘날 MM의 이론적인 근원으로 넓게 받아들여진다.  by 위키백과

 

Eroding and Dilating

이 둘은 이진 형태학의 기본 연산자이다. 

무슨말인지 모르겠지? 나도 모른다.

하지만 포기하지 말고

쉽게 생각해보자. 천천히 하나씩 알아보자.


1. 침식(Eroding)

침식의 정의는 다음과 같다. 동그라미 안에 (-) 빼기가 있다는 것만 기억하자.

침식을 하면 진한 파란색면을 동그란 디스크가 돌면서 디스크의 중심으로 깎아내서 밝은 파란색 정사각형을 만든다.

말 그대로 형태를 침식시키는 것이다.

 

적용 예시 : 검은 사진의 팩스를 받았다고 가정하자. 전부 새는 펜으로 쓴 것 같아 보인다. 침식 과정은 두꺼운 선을 얇게 만들고 글자 "o"의 구멍을 검출할 수 있다.


2. 팽창(Dilation)

팽창의 정의는 아래와 같다. 침식과 마찬가지로 동그라미 안에 플러스가 있다는것만 기억하자.

팽창은 짙은 파란색을 원판이 돌면서 팽창하므로 둥근 모서리가 있는 밝은 파란색 사각형을 만들게 된다.

적용 예시: 팽창은 침식의 쌍대연산이다. 매우 가는 선으로 그린 그림은 "팽창"하면 두꺼운 선으로 만들 수 있다. 이 말을 파악하기 가장 쉬운 방법은 같은 팩스나 글씨를 더 두꺼운 펜으로 쓴 것을 생각하는 것이다.


3. 열기 (Opening)

A를 B로 연 것은 A를 B로 침식한 후에 B로 팽창한 것이다.

열기 = 침식 -> 팽창 (Opening = Erosing -> Dilating)

쉽게 기억하자. 마이너스 했다가 플러스 되니까 닫혔다 열리는 것. 

무슨말이냐면 침식 > 팽창 순서로 두번 연산한 것이다.

침식하면 정사각형으로 줄어들었고, 팽창하면 동그란 사각형으로 늘어났던 것을 기억할 것이다.

위의 그림과 같이 열기를 하면 기존 형태의 크기는 그대로 유지되지만 겉은 둥글게 되는 결과를 가져온다.

그 말은 노이즈를 제거 한 후에 중요한 내용만 복귀시킨다는 뜻이 될 수도 있겠다.

 

적용 예시: 누가 방수 코팅된 종이에 메모를 해서 온통 뿌리에 잔뿌리가 뻩은 것 처럼 있다고 가정하자. 이 때, 열기는 본질적으로 내용은 보존하면서 "가는 선"을 제거한다. 부작용은 무엇이든지 둥글게 만든다는 것이다. 뾰족한 모서리는 점차 사라질 것이다.


4. 닫기 (Closing)

A를 B로 닫은 것은 A를 B로 팽창한 후에 B로 침식 시킨 것이다.

닫기 = 팽창 -> 침식 (Closing = Dilating -> Erosing)

이것도 쉽게 기억하자. 플러스 했다가 마이너스 되니까 열렸다가 닫히는 것.

팽창 한 후에 침식 시킨다.

팽창한 후에 침식 시킨다..

팽창한 후에 침식시키면 어떻게 되나..


잘 모르겠다. 아래 이미지를 보자. 

opening 부터 볼까?

erosing -> dilating, 침식 -> 팽창을 하고나면 어떻게 되나? 

1. 침식에서 겉으로 삐져나온 얆은 더듬이는 사라지고, 안으로 들어오는 콧구멍 같은건 넓어진다.

2. 팽창을 하면 이미 사라진 것은 팽창을 해도 다시 생겨나지 않는다. 밖으로 삐져나온 노이즈가 사라지는 것이다.

 

그다음은 closing

dilating -> erosing, 팽창 -> 침식을 하고나면 어떻게 되나?

1. 팽창을 하면 내부에 콧구멍 같은게 사라지고, 겉에 더듬이 부터 모든 부피가 커진다.

2. 그 상태에서 침식을 하면, 역시 이미 사라진 콧구멍은 생겨나지 않고 나머지 부분만 침식되어 수축된다.

결과물은 콧구멍이 사라지고 더듬이만 남게 되는 것이다.


실전 예시 : dilate, erode, open, close

자 이제 이 네개를 정확하게 이해했다.

팽창, 수축, 열기(침>팽), 닫기(팽>침)

 

Dilate는 굵게 만들고

Erode는 얇게 만들었으며

Open은 외부 노이즈를 없애주었고

Close는 내부 노이즈를 없애주었다.

 

Dilation을 거듭할수록 텍스트의 형태가 두꺼워지면서 묵둑해지고 흐릿해졌다. 기억나는가? 팽창을 하면 모서리가 둥근 사각형이 됐던것을..!

팽창 > 침식 --> Close를 해준 것이다. 내부 노이즈가 제거되고 형태만 남게 되었다.

 

좀 더 실용적인 예시를 보자. 

a가 원본이다. 흑백의 지문 이미지다.

b는 Dilation 한것. 노이즈가 부각되고 지문 자체가 커졌다. 

c는 Erosion 한 것. 노이즈가 제거됐다.

d는 Opening 한 것. 노이즈도 제거되고 지문도 더 명확해졌다.

e는 Closing 한 것. 노이즈가 더 커지기만 했다. 

여기서는 Erosion이 가장 적합해 보인다. 

이렇게 각각의 Application 마다 적합한 방식이 있는 것 같다.

 

비교

 

 

 


어떻게 코딩을 해야하냐 궁금하다면 아래 블로그를 참고해 보시라. 그리고 OpenCV 공식문서도 참고해보시라.

nicewoong.github.io/development/2018/01/05/erosion-and-dilation/

 

[Python-OpenCV] Erosion 과 Dilation - nicewoong

M1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) 메서드를 활용해서 더 손쉽게 Kernel Matrix 를 생성가능합니다.

nicewoong.github.io

docs.opencv.org/2.4.2/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html

 

Eroding and Dilating — OpenCV v2.4.2 documentation

Note Additionally, there is another parameter that allows you to perform multiple erosions (iterations) at once. We are not using it in this simple tutorial, though. You can check out the Reference for more details.

docs.opencv.org

아래 링크의 슬라이드쇼도 많은 도움이 된다.


역시 학문의 길은 끝이 없다. 이게 끝이 아니다.

여기서 진도를 조금 더 나가자면

이러한 형태학 알고리즘을 활용하면 아래와 같은 것들을 할 수 있다.

1. Boundary Extraction

2. Region filling

3. Extraction of connected components

4. Thining / thickening

5. Skeletonisation


더 궁금하다면 아래 슬라이드를 많이 참조했으니 한번 구경해 보시길. 


이제 이것들을 실전에 적용해 볼 차례다.

Erode, Dilate, Open, Close 

 

반응형

댓글