Morphology

hunnypooh·2022년 10월 21일
0

정의

  • 모폴로지(형태적) 기법
    • 영상 내에 존재하는 객체의 모양과 구조를 추출

    • 영상을 분석하고 처리하는데 사용

    • 미리 기하학적 형태를 알고 있는 대상물체의 정보를 반영하여 영상 내에서 원하는 부분만 추출

    • 영상 내에는 다양한 물체들이 혼합되어 있으며 우리가 관심을 가지는 나머지 물체들은 노이즈 성분

    • 마스크 기반 영상처리에서의 마스크 역할을 수행하는 구조요소(structuring element)를 사용하여 수행

    • 중요한 점은 구조 요소의 형태를 미리 알고 있는 기하학적 형태로 구성할 수 있음

      (자동차 뒷면 사진으로 번호판 알아내는 것도 모폴로지)

  • 기본 연산 - 침식, 팽창
  • 복합 연산 - 제거, 채움
  • 모폴로지 연산은 1)이진 모폴로지 연산 2)그레이 영상 모폴로지 연산으로 나뉨

침식(erosion) 연산

  • 수학적 정의 : 구조요소 B에 의한 집합 A의 침식(Erosion)

  • 의미 : z 에 의해 이동된 B가 A 에 완전히 포함되는 모든 점의 z의 집합

팽창(Dialtion) 연산

  • 수학적 정의 : 구조요소 B에 의한 집합 A의 팽창(Dilation)

  • 의미 : 구조요소 B를 원점에 반사시킨 후 z만큼 이동할 때 𝐵 와 A가 적어도 한 원소라도
    겹쳐지는 모든 z의 집합

제거(Opening) 연산 - 침식 → 팽창

  • 잡음 등의 영향으로 물체간의 가는 다리로 연결된 경우 이를 분리하는데 응용.
  • 수학적 정의

  • 의미 : A를 B로 침식 시킨 후,그 결과에 팽창 연산을 함

    • max, \bigcup 은 팽창
    • min, \bigcap 은 침식.

채움(Closing) 연산 - 팽창 → 침식

  • 길고 좁게 갈라진 틈을 메우며, 빈 구멍을 채움.

  • 수학적 정의

  • 의미 : A를 B로 팽창시킨 후, 그 결과에 침식 연산을 함

  • 원래 영상인 A는 closing한 영상 안에 포함됨
  • opening, closing 모두 여러 번 해도 결과가 똑같음.
  • closing은 A를 포함하는 C에게 동일한 구조적 영상으로 연산해도 그대로 포함됨.

closing 구현

import cv2 as cv
import numpy as np

src = cv.imread("coin.bmp", cv.IMREAD_GRAYSCALE)
H,W = src.shape[:]
output_dilation = np.zeros((H, W), src.dtype)
output_closing = np.zeros((H, W), src.dtype)

#1.팽창 -  최댓값 선택
for y in range(H):
    for x in range(W):
        max = 0
        for mi in range(-4, 5):
            for mj in range(-4, 5):
                if(-1 < y + mi < H and -1 < x + mj < W) :
                    tmp = src[y+mi][x+mj]
                    if(max < tmp):
                        max = tmp
        output_dilation[y][x] = max

#2. 침식 - 최솟값을 선택
for y in range(H):
    for x in range(W):
        min = 256
        for mi in range(-4, 5):
            for mj in range(-4, 5):
                if(-1 < y + mi < H and -1 < x + mj < W) :
                    tmp = output_dilation[y+mi][x+mj]
                    if(min > tmp):
                        min = tmp
        output_closing[y][x] = min

cv.imshow("input", src)
cv.imshow("output_dilation", output_dilation)
cv.imshow("output_closing", output_closing)
cv.waitKey(0)

Hit-or-Miss Transform

  • 영상 내에 존재하는 특정한 로컬 패턴을 찾아내는 연산.
    • 구석이나 경계점과 같이 특정한 형태를 가지는 픽셀들의 집합을 찾아내는 템플릿 매칭의 일종
    • Thinning 이나 Thickening 에 사용 가능

기타 basic morphological algorithms

1. Boundary Extraction

2. Hole Filling

3. Thinning

  • 객체의 끝점이나 연결성등의 topology 정보들은 유지하면서 객체의 모서리와 경계 부분을 깎아 들어가 결과적으로 객체를 가늘게 하는것
  • 구석이나 경계점과 같이 특정한 형태를 가지는 픽셀들의 집합을 찾아내는 템플릿 매칭의 일종

4. Thickening

  • Thinning 에 반대되는 dual 연산, thinning 에서의 전경은 thickening 에서 배경이 되고, thinning 에서의 배경은 thickening 에서 전경이 된다.
  • B는 Thinning에서 사용한 것과 같은 패턴을 사용

5. Pruning

  • Pruning methods are an essential complement to thinning and skeletonizing algorithm, because these procedures tend to leave spurs that need to be “cleaned up” by postprocessing.

6. Skeletons

7. Top Hat - opening/closing 이후 원 영상에서 빼줌

  • Top Hat 연산은 흑백영상(Gray-scale image)에서 특정 관심물체를 추출하기 위한 모폴로지 기법중의 하나.

Top hat 구현

  • top hat 후 otsu 알고리즘으로 이진화도 진행.
import cv2 as cv
import numpy as np
import lab04_otsu

src = cv.imread("rice.bmp", cv.IMREAD_GRAYSCALE)
H,W = src.shape[:]
output_errosion = np.zeros((H, W), src.dtype)
output_opening = np.zeros((H, W), src.dtype)
output_tophat = np.zeros((H, W), src.dtype)
output = np.zeros((H, W), src.dtype)

#1. 침식 - 최솟값을 선택
for y in range(H):
    for x in range(W):
        min = 256
        for mi in range(-6, 7):
            for mj in range(-6, 7):
                if(-1 < y + mi < H and -1 < x + mj < W):
                    tmp = src[y+mi][x+mj]
                    if(min > tmp) :
                        min = tmp
        output_errosion[y][x] = min

#2. 침식 후 팽창 - 최댓값 선택
for y in range(H):
    for x in range(W):
        max = 0
        for mi in range(-6,7):
            for mj in range(-6,7):
                if(-1 < y + mi < H and -1 < x + mj < W) :
                    tmp = output_errosion[y+mi][x+mj]
                    if(max < tmp):
                        max = tmp
        output_opening[y][x] = max

#3. 영상 빼기
for y in range(H):
    for x in range(W):
        output_tophat[y][x] = src[y][x] - output_opening[y][x]


#4.이진화 - otsu알고리즘 이용
output = lab04_otsu.otsu(output_tophat)

cv.imshow("input", src)
cv.imshow("output_opening", output_opening)
cv.imshow("output_tophat", output_tophat)
cv.imshow("output", output)
cv.waitKey(0)

8. Gradient

profile
간단한것들 정리

0개의 댓글