πŸ“Œ[μ΄λ―Έμ§€μ²˜λ¦¬] 침식과 팽창의 μŒλŒ€μ„±

μ΄μ‚¬λ¬΄μ—˜Β·2023λ…„ 10μ›” 2일

μ΄λ―Έμ§€μ²˜λ¦¬

λͺ©λ‘ 보기
4/6
post-thumbnail

ν˜•νƒœν•™μ  연산은 이미지 μ²˜λ¦¬μ™€ 뢄석 λΆ„μ•Όμ—μ„œ μ΄λ―Έμ§€μ˜ ꡬ쑰적 νŠΉμ§•μ„ κ°•μ‘°ν•˜κ±°λ‚˜ λ³€ν˜•ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” ν˜•νƒœν•™μ˜ 두 κ°€μž₯ 기본적인 연산인 침식(Erosion)κ³Ό 팽창(Dilation)의 μ€‘μš”ν•œ 관계, 즉 'μŒλŒ€μ„±'에 λŒ€ν•΄ λ‹€λ£Ήλ‹ˆλ‹€.

πŸŽ“μΉ¨μ‹κ³Ό 팽창

  • 침식 : AβŠ–BA \ominus B 으둜 ν‘œκΈ°ν•˜λ©° BxB_x(κ΅¬μ‘°μš”μ†Œ Bλ₯Ό 쀑심 xx둜 μ΄λ™μ‹œν‚¨ μ§‘ν•©)의 λͺ¨λ“  μš”μ†Œκ°€ A에 ν¬ν•¨λœλ‹€λ©΄ ν•΄λ‹Ή μœ„μΉ˜μ— Foreground{Foreground}λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

    μ •μ˜ : AβŠ–B={x∣BxβŠ†A}A \ominus B = \{ x \mid B_x \subseteq A \}

  • 팽창 : AβŠ•BA \oplus B 으둜 ν‘œκΈ°ν•˜λ©° BxB_x(κ΅¬μ‘°μš”μ†Œ Bλ₯Ό 쀑심 xx둜 μ΄λ™μ‹œν‚¨ μ§‘ν•©)의 μš”μ†Œμ€‘ ν•˜λ‚˜λΌλ„ A에 ν¬ν•¨λœλ‹€λ©΄ ν•΄λ‹Ή μœ„μΉ˜μ— Foreground{Foreground}λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

    μ •μ˜ : AβŠ•B={x∣Bx^∩Aβ‰ βˆ…}A \oplus B = \{ x \mid \hat{B_x} \cap A \neq \emptyset \}

πŸŽ²μΉ¨μ‹κ³Ό 팽창의 μŒλŒ€μ„±(Duality)

침식과 νŒ½μ°½μ€ ν˜•λŒ€ν•™μ  μ—°μ‚°μ˜ 기본적인 μ—°μ‚°μž…λ‹ˆλ‹€. 이런 기본적인 두 μ—°μ‚°μžλŠ” μ„œλ‘œ μ„ κ³Ό μ•…μ²˜λŸΌ Duality 관계에 μžˆμŠ΅λ‹ˆλ‹€.
μ‰½κ²Œ μ„€λͺ…ν•˜μžλ©΄, Binary Image에 λŒ€ν•΄ 침식연산을 ν•œλ‹€λ©΄ 전경이 κΉμ—¬λ‚˜κ°€λ“―μ΄ μž‘μ•„μ§€κ²Œ λ©λ‹ˆλ‹€. 이λ₯Ό 배경에 λŒ€ν•΄μ„œ μ„€λͺ…ν•˜μžλ§Œ 배경이 μ»€μ‘Œλ‹€κ³  ν•  수 있죠, 전경은 침식 λ˜μ—ˆμ§€λ§Œ, 배경은 팽창 ν•˜κ²Œ λœκ²ƒμž…λ‹ˆλ‹€.

μˆ˜ν•™μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄

(AβŠ–B)c=AcβŠ•B^(A \ominus B)^c = A^c \oplus \hat{B}

  • AcA^cλŠ” A의 μ—¬μ§‘ν•©(complementation)

  • B^\hat{B}λŠ” B의 λ°˜μ „(reflection)

    이 κ΄€κ³„λŠ” 침식과 팽창이 μ„œλ‘œ μŒλŒ€μ μΈ 관계에 μžˆλ‹€λŠ” 것을 λ³΄μ—¬μ€λ‹ˆλ‹€.
    λ‹€μ‹œ 말해, ν•˜λ‚˜μ˜ 연산은 λ‹€λ₯Έ 연산을 톡해 μ—¬μ§‘ν•©κ³Ό κ΄€λ ¨λœ κ΄€μ μ—μ„œ ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” 것을 λ§ν•©λ‹ˆλ‹€.


  • 침식과 팽창의 μ •μ˜

    AβŠ–B={x∣BxβŠ†A}A \ominus B = \{x \mid B_x \subseteq A \}
    AβŠ•B={x∣Bx^∩Aβ‰ βˆ…}A \oplus B = \{ x \mid \hat{B_x} \cap A \neq \emptyset \}

  • Duality λͺ…μ œ

    AcβŠ–B^=(AβŠ•B)c(1)AcβŠ•B^=(AβŠ–B)c(2)\begin{aligned} &A^c \ominus \hat{B} = (A \oplus B)^c && \text{(1)} \\ &A^c \oplus \hat{B} = (A \ominus B)^c && \text{(2)} \\ \end{aligned}
  • 1) 증λͺ…:

    (AβŠ–B)c={x∣BxβŠ†A}c(1)={x∣Bx⊈Ac}(2)={x∣Bx∩Acβ‰ 0}(3)={x∣(B^)βˆ’x∩Acβ‰ 0}(4)=AcβŠ•B^(5)\begin{aligned} (A \ominus B)^c & = \{x \mid B_x \subseteq A\}^c && \text{(1)} \\ &= \{ x \mid B_x \nsubseteq A^c\} && \text{(2)}\\ &= \{ x \mid B_x \cap A^c\neq0\} && \text{(3)}\\ &= \{ x \mid (\hat{B})_{-x} \cap A^c\neq0\} && \text{(4)}\\ &= A^c \oplus \hat{B} && \text{(5)}\\ \end{aligned}
    • μ„€λͺ… :
      (1) μΉ¨μ‹μ˜ μ •μ˜ : 침식 연산은 ꡬ쑰 μš”μ†Œ BBκ°€ μ§‘ν•© AA의 ν•˜μœ„ 집합이 λ˜λŠ” λͺ¨λ“  μ›μ†Œ xx의 집합을 λ‚˜νƒ€λ‚Έλ‹€.
      (2) μ—¬μ§‘ν•© : 침식 결과의 여집합을 μ‚¬μš©ν•˜λ―€λ‘œ λ…Όλ¦¬μ μœΌλ‘œ, λ§Œμ•½ BxB_xκ°€ AA의 ν•˜μœ„ 집합이 μ•„λ‹ˆλΌλ©΄, μ΄λŠ” BxB_xκ°€ AA의 μ—¬μ§‘ν•©κ³Ό μ–΄λ–€ 곡톡 μ›μ†Œλ„ κ°€μ§€κ³  μžˆμ§€ μ•„λ‹ˆν•¨μ„ μ˜λ―Έν•œλ‹€.
      (3) λ“œλͺ¨λ₯΄κ°„ λ²•μΉ™μ˜ 정리 : BxB_xκ°€ AA의 ν•˜μœ„ 집합이 μ•„λ‹ˆλΌλ©΄, BxB_x와 AcA^cλŠ” λ°˜λ“œμ‹œ κ³΅ν†΅λœ μ›μ†Œλ₯Ό κ°€μ§€κ²Œ 됨으둜 ꡐ집합 기호둜 이와 같이 ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€
      (4) κ΅¬μ‘°μš”μ†Œμ˜ λ³€ν˜• : B^\hat{B}의 μ •μ˜μ— 따라 B^x=Bβˆ’x\hat{B}_x = B_{-x}이닀. κ·ΈλŸ¬λ―€λ‘œ BBλ₯Ό B^βˆ’x\hat{B}_{-x}둜 ν‘œν˜„ν•  수 μžˆλ‹€.
      (5) 팽창의 μ •μ˜ : 팽창 μ—°μ‚°μ˜ μ •μ˜λ₯Ό μ μš©ν•˜μ—¬ AcA^c와 B^\hat{B}의 팽창으둜 ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.
  • 2) 증λͺ… :

    (AβŠ•B)c={x∣B^x∩Aβ‰ βˆ…}c(1)={x∣B^x∩A=βˆ…}(2)={x∣B^xβŠ†Ac}(3)=AcβŠ–B^(4)\begin{aligned} (A \oplus B)^c &= \{x \mid \hat{B}_x \cap A \neq \emptyset \}^c && \text{(1)}\\ &= \{x \mid \hat{B}_x \cap A = \emptyset \} && \text{(2)}\\ &= \{x \mid \hat{B}_x \subseteq A^c\} && \text{(3)}\\ &= A^c \ominus \hat{B}&& \text{(4)}\\ \end{aligned}
    • μ„€λͺ… :
      (1) 팽창의 μ •μ˜ : 팽창 연산은 ꡬ쑰 μš”μ†Œ BBκ°€ μ§‘ν•© AA의 ν•˜μœ„ 집합이....
      (2) μ—¬μ§‘ν•©μ˜ μ •μ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
      (3) μ—¬κΈ°μ„œ, B^x∩A=βˆ…\hat{B}_x \cap A = \emptyset을 λ‹€λ₯΄κ²Œ ν‘œν˜„ν•˜λ©΄ B^xβŠ†Ac\hat{B}_x \subseteq A^c둜 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      (4) μΉ¨μ‹μ˜ μ •μ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ§ˆμ§€λ§‰ λ³€ν™˜μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • 정리 :

    • (AβŠ–B)c=AcβŠ•B^(A \ominus B)^c = A^c \oplus \hat{B}
    • (AβŠ•B)c=AcβŠ–B^(A \oplus B)^c = A^c \ominus \hat{B}

    μœ„ 두 μ—°μ‚°μ˜ 증λͺ…을 톡해 침식 μ—°μ‚° ν›„μ˜ 여집합이, 원본 μ΄λ―Έμ§€μ˜ 여집합을 μ‚¬μš©ν•˜μ—¬ λ°˜μ „λœ κ΅¬μ‘°μš”μ†Œλ‘œ 팽창 연산을 μˆ˜ν–‰ν•œ 것과 λ™μΌν•˜λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 μˆ˜μ‹μ„ ν™œμš©ν•œλ‹€λ©΄ 계산을 λ”μš± 효율적으둜 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ“Šμ˜ˆμ œ μ½”λ“œ

import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import binary_erosion, binary_dilation
	# μ΄μ§„μ˜μƒμ΄λ―€λ‘œ scipy의 이진침식, νŒ½μ°½μ„ μ΄μš©ν•¨

def complement(image):                  # A^c: μ΄λ―Έμ§€μ˜ μ—¬μ§‘ν•©
   return np.logical_not(image)

def reflect(struct_elem):               # \hat{B}: ꡬ쑰 μš”μ†Œ λ°˜μ „ν•˜κΈ°
   return np.flip(struct_elem)

def translate(struct_elem, x):          # 평행 이동.
   return np.roll(struct_elem, shift=x, axis=(0,1))

def erosion(image, struct_elem):        # A \ominus B
   return binary_erosion(image, structure=struct_elem)

def dilation(image, struct_elem):       # A \oplus B
   return binary_dilation(image, structure=struct_elem)

def plot_image(image, title):
   plt.imshow(image, cmap='gray')
   plt.title(title)
A = np.array(
   [
       [0,0,0,0,0,0,0,0,0,0],
       [0,1,1,1,0,0,1,1,1,0],
       [0,1,1,1,0,1,0,1,1,0],
       [0,0,1,0,0,0,0,1,0,0],
       [0,0,0,0,1,0,0,0,0,0],
       [0,0,0,1,1,1,0,0,0,0],
       [0,0,0,1,1,1,1,1,0,0],
       [0,0,0,1,1,1,1,0,0,0],
       [0,0,0,0,0,0,0,1,0,0],
       [0,0,0,0,0,0,1,1,1,1]
   ], 
   dtype=bool)
B = np.array([[0,0,0], [0,1,1], [0,1,0]], dtype=bool)

A_oplus_B = dilation(A, B)
A_ominus_B = erosion(A, B)
plt.subplot(2,2,1)
plot_image(A, "A")

plt.subplot(2,2,2)
plot_image(B, "B")

plt.subplot(2,2,3)
plot_image(A_oplus_B, "A_oplus_B")

plt.subplot(2,2,4)
plot_image(A_ominus_B, "A_ominus_B")

plt.tight_layout()
plt.show()

  • μ—°μ‚°κ³Όμ • 증λͺ… λΆ€λŠ” λ‚˜μ€‘μ—

0개의 λŒ“κΈ€