opencv(opening과 closing)
이전 포스트에서 침식 연산과 팽창 연산을 배웠습니다. 이번에는 배울 opening과 closing 연산은 침식 연산과 팽창 연산의 혼합 응용으로, 열림 연산과 닫힘 연산에 대한 개념을 보실 분들은 이전 강의를 참고하시기 바랍니다.
jhtechblog.tistory.com/entry/ErosionDilationOpeningClosingOpencv
1. Opening
Opening 연산은 Erosion 연산 후 Dilation 연산을 적용하는 것입니다. 즉 Erosion + Dilation인데, 이 순서가 중요합니다.
Erosion을 진행하면서 노이즈(작은 흰색 오브젝트)를 없애고 같이 작아지는 오브젝트를 보완해주기 위해 Dilation을 적용합니다. 노이즈는 Erosion연산을 통해 이미 모두 배경으로 바꼈다면, 그 후 Dilation을 아무리 해도 다시 흰색 노이즈가 생긴 수 없기 때문에 이러한 원리를 이용해 노이즈를 제거합니다.
물론 가장 이상적인 Iteration 혹은 Kernel 사이즈를 찾아내는 것이 번거롭고 어려울 수 있지만 여러가지 옵션에 대해 직접 실험해보면서 본인 목적에 맞는 Opening 연산을 찾아낼 수 있을겁니다.
kernel = np.ones((5, 5), np.uint8) |
이러한 기능은 opencv의 morphologyEX를 이용해 간단하게 코드로 구현할 수 있습니다. 가장 일반적인 kernel은 정사각형 형태이지만, 아래 코드와 같이 커널의 모양을 다양하게 변화시켜서 사용할 수 있습니다.
import numpy as np
import cv2
rectangle = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) #사각형
ellipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) #타원
cross = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5)) #십자가
직접 np array로 구성할 수도 있지만 가장 빠르고 쉽게는 cv의 getStructuringElement라는 함수를 사용하는 것입니다.
(원하는 모양, 사이즈)를 Input으로 넣어주면 알아서 np array로 원하는 모양의 kernel을 반환해줍니다.
Opening 연산은 Erosion 연산 후 Dilation 연산을 적용하는 것입니다. 즉 Erosion + Dilation인데, 이 순서가 중요합니다.
Erosion을 진행하면서 노이즈(작은 흰색 오브젝트)를 없애고 같이 작아지는 오브젝트를 보완해주기 위해 Dilation을 적용합니다. 노이즈는 Erosion연산을 통해 이미 모두 배경으로 바꼈다면, 그 후 Dilation을 아무리 해도 다시 흰색 노이즈가 생긴 수 없기 때문에 이러한 원리를 이용해 노이즈를 제거합니다.
2. Closing
Opening 연산은 Erosion 연산 후 Dilation 연산을 적용했다면 Closing은 반대로 Dilation을 진행한 후 Erosion을 적용합니다.
Opening = Erosion + Dilation
Closing = Dilation + Erosion
Opening은 노이즈를 제거하는데 활용되었다면, Closing은 오브젝트안에 포함되어 있는 작은 구멍들을 메우는데 활용됩니다. 코드는 마찬가지로 morphologyEx를 활용하며 MORPH_CLOSE로 옵션을 정해줍니다.
kernel = np.ones((3, 3), np.uint8) |
커널 크기를 크게 가져갈수록 커버할 수 있는 구멍의 크기도 커지며 커널 크기가 작더라도 Iteration을 통해서 보완을 할 수도 있습니다.
Opening과 Closing 연산에 활용되었던 cv2.MORPH_CLOSE와 cv2.MORPH_OPEN는 이미지 후처리/전처리에서 대표적으로 활용되고 있으며 이외에도 제공되는 기능들이 있으므로 알아두면 좋을 것 같습니다.
cv2.MORPH_BLACKHAT: closing과 원본 이미지의 차이를 반환
cv2.MORPH_TOPHAT: opening과 원본 이미지의 차이를 반환
cv2.MORPH_GRADIENT: Deliation과 erosion이미지의 차이를 반환
Reference
opencv-python.readthedocs.io/en/latest/doc/12.imageMorphological/imageMorphological.html