๐Ÿ“Œ [์ด๋ฏธ์ง€์ฒ˜๋ฆฌ] ๋ชจํด๋กœ์ง€์—ฐ์‚ฐ

์ด์‚ฌ๋ฌด์—˜ยท2023๋…„ 9์›” 29์ผ

์ด๋ฏธ์ง€์ฒ˜๋ฆฌ

๋ชฉ๋ก ๋ณด๊ธฐ
3/6

๐Ÿ”Ž๋ชจํด๋กœ์ง€๋ž€?

๋ชจํด๋กœ์ง€์˜ ์ •์˜

์ด๋ฏธ์ง€์—์„œ์˜ ๋ชจํด๋กœ์ง€(ํ˜•ํƒœํ•™)์€ ๊ฐ์ฒด์˜ ํ˜•ํƒœ ๋ฐ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ฃผ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ด๋ฏธ์ง€์—์„œ ๊ฐ์ฒด์˜ ๊ฒฝ๊ณ„๋ฅผ ์กฐ์ ˆํ•˜๊ฑฐ๋‚˜, ๋…ธ์ด์ฆˆ๋ฅผ ์ œ๊ฑฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ตฌ์กฐ ์š”์†Œ๋ผ๋Š” ํŠน์ • ํ˜•ํƒœ์™€ ํ•จ๊ป˜ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

๋ชจํด๋กœ์ง€์˜ ์ค‘์š”์„ฑ

๋ชจํด๋กœ์ง€๋Š” ์ด๋ฏธ์ง€ ๋‚ด์˜ ์ž‘์€ ๋…ธ์ด์ฆˆ๋‚˜ ํŠน์ด์ ๋“ค์„ ์ œ๊ฑฐํ•˜๊ณ , ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋ฅผ ๋šœ๋ ทํ•˜๊ฒŒ ํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค. ๋˜ํ•œ ํ†ต๊ณ„ํ•™์  ์—ฐ์‚ฐ์œผ๋กœ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด ์œตํ•ฉ์ ์œผ๋กœ ๋งŽ์ด ํ™œ์šฉ๋œ๋‹ค.


๐Ÿ“š๋ชจํด๋กœ์ง€ ์—ฐ์‚ฐ

0. ๊ตฌ์กฐ์š”์†Œ (Structuring Element)

๊ตฌ์กฐ ์š”์†Œ๋Š” ๋ชจํด๋กœ์ง€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํšŒ์ƒ‰์กฐ ์ด๋ฏธ์ง€์ด๋‹ค.
๋Œ€ํ‘œ์ ์œผ๋กœ ์ง์‚ฌ๊ฐํ˜•, ์›, ๋งˆ๋ฆ„๋ชจ ๋“ฑ์˜ ํ˜•ํƒœ๊ฐ€ ์žˆ๋‹ค. ๊ตฌ์กฐ ์š”์†Œ์˜ ํฌ๊ธฐ์™€ ํ˜•ํƒœ์— ๋”ฐ๋ผ ๋ชจํด๋กœ์ง€ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

  • FIT : ๊ตฌ์กฐ ์š”์†Œ์˜ ํฌ๊ทธ๋ผ์šด๋“œ๊ฐ€ ์ด๋ฏธ์ง€์˜ ํŠน์ • ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์™„๋ฒฝํžˆ ์ผ์น˜
    BโІAB \subseteq A
  • HIT : ๊ตฌ์กฐ ์š”์†Œ์˜ ํฌ๊ทธ๋ผ์šด๋“œ๊ฐ€ ์ด๋ฏธ์ง€์˜ ํŠน์ • ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ผ๋ถ€ ์ผ์น˜
    BโˆฉAโ‰ โˆ…B \cap A \neq \emptyset
    (AโˆฉB1)โ‰ โˆ…ย andย (AcโˆฉB2)=โˆ…(A \cap B_1) \neq \emptyset \ \text{and} \ (A^c \cap B_2) = \emptyset
  • MISS : ๊ตฌ์กฐ ์š”์†Œ์˜ ํฌ๊ทธ๋ผ์šด๋“œ๊ฐ€ ์ด๋ฏธ์ง€์˜ ํŠน์ • ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ „ํ˜€ ๋ถˆ์ผ์น˜
    BโˆฉA=โˆ…B \cap A = \emptyset
    โ€ป Aห‰\bar{A} : ์ด๋ฏธ์ง€์˜ ํŠน์ • ๋ถ€๋ถ„
    โ€ป Bห‰\bar{B} : ๊ตฌ์กฐ ์š”์†Œ ํ–‰๋ ฌ
    โ€ป ํฌ๊ทธ๋ผ์šด๋“œ : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์™€ ๋ฐ˜๋Œ€ ๊ฐœ๋…์œผ๋กœ, ๋ฐฐ๊ฒฝ์ด ์•„๋‹Œ ์š”์†Œ
    FITHITMISS

๊ธฐ์ดˆ์ ์ธ ์—ฐ์‚ฐ

1. ์นจ์‹๊ณผ ํŒฝ์ฐฝ ์—ฐ์‚ฐ (Erosion & Dilation)

  • ์นจ์‹(Erosion) : ๊ตฌ์กฐ ์š”์†Œ๊ฐ€ ์ด๋ฏธ์ง€ ๋‚ด์— ์™„์ „ํžˆ ๋“ค์–ด๋งž์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ํ”ฝ์…€์„ ์ œ๊ฑฐ
    (AโŠ–B)={xโˆฃBxโІA}(A \ominus B) = \{ x \mid B_x \subseteq A \}
  • ํŒฝ์ฐฝ(Dilation) : ๊ตฌ์กฐ ์š”์†Œ์™€ ์ด๋ฏธ์ง€๊ฐ€ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ํ•ด๋‹น ํ”ฝ์…€์„ ์ถ”๊ฐ€
    (AโŠ•B)={xโˆฃ(BxฮดโˆฉA)โ‰ โˆ…}(A \oplus B) = \{ x \mid (B^{\delta}_x \cap A) \neq \emptyset \}

2. ์—ด๋ฆผ๊ณผ ๋‹ซํž˜ ์—ฐ์‚ฐ (Opening & Closing)

  • ์—ด๋ฆผ(Opening) : ์—ด๋ฆผ ์—ฐ์‚ฐ์€ ์นจ์‹ ์—ฐ์‚ฐ ํ›„ ํŒฝ์ฐฝ ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ •์˜
    Aโˆ˜B=(AโŠ–B)โŠ•BA \circ B = (A \ominus B) \oplus B
  • ๋‹ซํž˜(Closing) : ๋‹ซํž˜ ์—ฐ์‚ฐ์€ ํŒฝ์ฐฝ ์—ฐ์‚ฐ ํ›„ ์นจ์‹ ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ •์˜
    Aโˆ™B=(AโŠ•B)โŠ–BA \bullet B = (A \oplus B) \ominus B

    ์นจํŒฝ์—ด๋‹ซ ์ •๋ฆฌ :

    ์—ฐ์‚ฐ์ •์˜ํŠน์ง•
    ์นจ์‹์ด๋ฏธ์ง€์—์„œ ๊ตฌ์กฐ ์š”์†Œ๊ฐ€ ์™„์ „ํžˆ ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ์ œ๊ฑฐ- ๊ฐ์ฒด์˜ ๊ฒฝ๊ณ„๋ฅผ ์ค„์ž„
    - ์ž‘์€ ๊ฐ์ฒด๋‚˜ ๋Œ์ถœ๋ถ€๋ฅผ ์ œ๊ฑฐ
    - ์ „๊ฒฝ ํ”ฝ์…€์„ ๊ฐ์†Œ
    ํŒฝ์ฐฝ์ด๋ฏธ์ง€์™€ ๊ตฌ์กฐ ์š”์†Œ๊ฐ€ ๊ฒน์น˜๋Š” ๋ชจ๋“  ๋ถ€๋ถ„์„ ์ถ”๊ฐ€- ๊ฐ์ฒด์˜ ๊ฒฝ๊ณ„๋ฅผ ํ™•์žฅ
    - ์ž‘์€ ํ™ˆ์ด๋‚˜ ๊ตฌ๋ฉ์„ ๋ฉ”์›€
    - ์ „๊ฒฝ ํ”ฝ์…€์„ ์ฆ๊ฐ€
    ์—ด๋ฆผ์นจ์‹ ํ›„ ํŒฝ์ฐฝ- ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ
    - ์ž‘์€ ๊ฐ์ฒด๋‚˜ ๋Œ์ถœ๋ถ€๋ฅผ ์ œ๊ฑฐ
    - ํฐ ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋Š” ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ์œ ์ง€
    ๋‹ซํž˜ํŒฝ์ฐฝ ํ›„ ์นจ์‹- ์ž‘์€ ํ™ˆ์ด๋‚˜ ๊ฐ„๊ทน์„ ๋ฉ”์›€
    - ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ์ž‘์€ ๊ตฌ๋ฉ์„ ์ œ๊ฑฐ
    - ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ•ํ™”
     import cv2
     import numpy as np
     import matplotlib.pyplot as plt
     
     # ์›๋ณธ ํ–‰๋ ฌ
     original = np.array([
         [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
         [0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
         [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
         [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
         [0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0],
         [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
         [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
         [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
     ], dtype=np.uint8)
     
     # ๊ตฌ์กฐ ์š”์†Œ
     SE = np.array([
         [1, 1],
         [1, 1]
     ], dtype=np.uint8)
     
     # ์นจ์‹์—ฐ์‚ฐ
     erosion = cv2.erode(original, SE, iterations=1)
     
     # ํŒฝ์ฐฝ์—ฐ์‚ฐ
     dilation = cv2.dilate(original, SE, iterations=1)
     
     # ๊ฒฐ๊ณผ ํ‘œ์‹œ
     plt.figure(figsize=(12, 4))
     
     plt.subplot(1, 3, 1)
     plt.imshow(original, cmap='gray')
     plt.title('Original')
     
     plt.subplot(1, 3, 2)
     plt.imshow(erosion, cmap='gray')
     plt.title('Erosion')
     
     plt.subplot(1, 3, 3)
     plt.imshow(dilation, cmap='gray')
     plt.title('Dilation')
     
     plt.tight_layout()
     plt.show()
    result_erosion&dilation

๊ทธ๋ ˆ๋””์–ธํŠธ (Morphological Gradient)

ํŒฝ์ฐฝ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ์— ์นจ์‹ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋บ€ ๊ฒƒ์œผ๋กœ ์ •์˜๋˜๋ฉฐ ์ด๋ฏธ์ง€์˜ ๊ฒฝ๊ณ„๋‚˜ ์œค๊ณฝ์„ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ์™ธ๊ณฝ์„ ๊ฐ•์กฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
ํŒฝ์ฐฝ๊ณผ ์นจ์‹์˜ ์ฐจ์ด๋Š” ๋ฐ๊ธฐ๋‚˜ ์ƒ‰์ƒ, ํ”ฝ์…€ ๊ฐ’์˜ ๋ณ€ํ™”๋ฅผ ๋‚˜ํƒ€๋‚ด๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ด ๊ฒฝ๊ณ„๊ฐ•์กฐ ์—ฐ์‚ฐ์„ ๊ทธ๋ ˆ๋””์–ธํŠธ ์—ฐ์‚ฐ์ด๋ผ ๋ถˆ๋ฆฐ๋‹ค.. (์–ด์šฐ ํ—ท๊ฐˆ๋ ค..)
Gradient(A)=(AโŠ•B)โˆ’(AโŠ–B){Gradient}(A)=(AโŠ•B)โˆ’(AโŠ–B)

 img = cv2.imread('moon.jpg', cv2.IMREAD_GRAYSCALE)
 SE = np.array([
     [0, 1, 0],
     [1, 1, 1],
     [0, 1, 0]
 ], dtype=np.uint8)
 
 erosion = cv2.erode(img, SE, iterations=1)
 dilation = cv2.dilate(img, SE, iterations=1)
 gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, SE)
 
 # ๊ฒฐ๊ณผ ํ‘œ์‹œ
 plt.figure(figsize=(16, 4))
 
 plt.subplot(1, 4, 1)
 plt.imshow(img, cmap='gray')
 plt.title('Original Image')
 
 plt.subplot(1, 4, 2)
 plt.imshow(erosion, cmap='gray')
 plt.title('Erosion')
 
 plt.subplot(1, 4, 3)
 plt.imshow(dilation, cmap='gray')
 plt.title('Dilation')
 
 plt.subplot(1, 4, 4)
 plt.imshow(gradient, cmap='gray')
 plt.title('Morphological Gradient')
 
 plt.tight_layout()
 plt.show()

Gradient


ํ†ฑํ–‡๊ณผ ๋ธ”๋ž™ํ–‡ ์—ฐ์‚ฐ (Top-Hat, Black-Hat)

์›๋ณธ ์ด๋ฏธ์ง€์™€ ์ด๋ฏธ์ง€์— ํŠน์ • ๋ชจํด๋กœ์ง€ ์—ฐ์‚ฐ์„ ์ ์šฉํ•œ ๊ฒฐ๊ณผ ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ํ‘œ์‹œํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ๋ฐ๊ฑฐ๋‚˜ ์–ด๋‘์šด ์ง€์—ญ์˜ ์ž‘์€ ๋ณ€ํ™”๋‚˜ ๋…ธ์ด์ฆˆ๋ฅผ ๊ฐ์ง€ํ•˜๋Š”๋ฐ ์œ ์šฉํ•˜๋‹ค.

  • ํ†ฑํ–‡(Top-hat) : ์›๋ณธ ์ด๋ฏธ์ง€์—์„œ ์—ด๋ฆผ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋บ€ ๊ฒƒ์œผ๋กœ ์ •์˜
  • ๋ธ”๋ž™ํ–‡(Black-hat) : ์›๋ณธ ์ด๋ฏธ์ง€์—์„œ ๋‹ซํž˜ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋บ€ ๊ฒƒ์œผ๋กœ ์ •์˜

1. ํ†ฑํ–‡ ์—ฐ์‚ฐ (Top-Hat)

์นจ์‹์—ฐ์‚ฐ ํ›„์˜ ์ด๋ฏธ์ง€์™€ ์›๋ณธ ์ด๋ฏธ์ง€์™€์˜ ์ฐจ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์€ ๋ฐ์€ ๋ฐฐ๊ฒฝ ์œ„์˜ ์ž‘์€ ์–ด๋‘์šด ๊ฐ์ฒด๋‚˜ ๋…ธ์ด์ฆˆ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

TopHat(A)=Aโˆ’(AโŠ–B){TopHat}(A) = Aโˆ’(AโŠ–B)

2. ๋ธ”๋ž™ํ–‡ ์—ฐ์‚ฐ (Black-Hat)

ํŒฝ์ฐฝ์—ฐ์‚ฐ ํ›„์˜ ์ด๋ฏธ์ง€์™€ ์›๋ณธ ์ด๋ฏธ์ง€์™€์˜ ์ฐจ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์€ ์–ด๋‘์šด ๋ฐฐ๊ฒฝ ์œ„์˜ ์ž‘์€ ๋ฐ์€ ๊ฐ์ฒด๋‚˜ ๋…ธ์ด์ฆˆ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

BlackHat(A)=(AโŠ•B)โˆ’A{BlackHat}(A)=(AโŠ•B)โˆ’A

   img = cv2.imread('moon.jpg', cv2.IMREAD_GRAYSCALE)
   SE = np.ones([9,9])
   
   # ๋…ธ์ด์ฆˆ ์ถ”๊ฐ€
   noises = 100  # ๋…ธ์ด์ฆˆ๋กœ ์ถ”๊ฐ€ํ•  ์ ์˜ ์ˆ˜
   for _ in range(noises):
       x = np.random.randint(0, img.shape[1])  # ๋žœ๋คํ•œ x ์ขŒํ‘œ
       y = np.random.randint(0, img.shape[0])  # ๋žœ๋คํ•œ y ์ขŒํ‘œ
       img[y, x] = 255  # ํ•ด๋‹น ์ขŒํ‘œ์˜ ํ”ฝ์…€ ๊ฐ’์„ 0 (๊ฒ€์€์ƒ‰)์œผ๋กœ ๋ณ€๊ฒฝ
   
   # ํ†ฑํ–‡ ์—ฐ์‚ฐ
   tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, SE)
   
   # ๋ธ”๋ž™ํ–‡ ์—ฐ์‚ฐ
   blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, SE)
   
   # ๊ฒฐ๊ณผ ํ‘œ์‹œ
   plt.figure(figsize=(12, 4))
   
   plt.subplot(1, 3, 1)
   plt.imshow(img, cmap='gray')
   plt.title('Original')
   
   plt.subplot(1, 3, 2)
   plt.imshow(tophat, cmap='gray')
   plt.title('Top Hat')
   
   plt.subplot(1, 3, 3)
   plt.imshow(blackhat, cmap='gray')
   plt.title('Black Hat')
   
   plt.tight_layout()
   plt.show()

TopAndBlack_hat


ํžˆํŠธ๋ฏธ์Šค ์—ฐ์‚ฐ (Hit-or-Miss)

๋ฐ”์ด๋„ˆ๋ฆฌ ์ด๋ฏธ์ง€์—์„œ ํŠน์ • ํŒจํ„ด์„ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ์‚ฐ์œผ๋กœ, ๋‘ ๊ฐœ์˜ ๊ตฌ์กฐ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜๋Š” ํžˆํŠธ ํ•˜๋‚˜๋Š” ๋ฏธ์Šค๋ฅผ ์ฐพ์•„ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

AโŠšB=(AโŠ–B1)โˆฉ(AcโŠ–B2)A \circledcirc B = (A \ominus B_1) \cap (A^c \ominus B_2)

์—ฌ๊ธฐ์„œ B1B_{1}์€ ํžˆํŠธ ๊ตฌ์กฐ์š”์†Œ, B2B_{2}๋Š” ๋ฏธ์Šค ๊ตฌ์กฐ ์š”์†Œ, AcA^c๋Š” ์ด๋ฏธ์ง€ AA์˜ ์—ฌ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread('moon.jpg', cv2.IMREAD_GRAYSCALE)

# SE, 1์€ ํžˆํŠธ, -1์€ ๋ฏธ์Šค
SE = np.array([
    [-1, -1,  1, -1, -1],
    [-1,  1,  1,  1, -1],
    [ 1,  1,  1,  1,  1],
    [-1,  1,  1,  1, -1],
    [-1, -1,  1, -1, -1]
], dtype=np.uint8)

# ํžˆํŠธ๋ฏธ์Šค ์—ฐ์‚ฐ
hitormiss = cv2.morphologyEx(image, cv2.MORPH_HITMISS, SE)

# ๊ฒฐ๊ณผ ํ‘œ์‹œ
plt.figure(figsize=(10, 4))

plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original')

plt.subplot(1, 2, 2)
plt.imshow(hitormiss, cmap='gray')
plt.title('Hit-or-Miss')

plt.tight_layout()
plt.show()

HitOrMiss


์ •๋ฆฌ

์—ฐ์‚ฐ์ˆ˜์‹์ˆ˜์‹ ์„ค๋ช…์‚ฌ์šฉ ๋ถ„์•ผ
์นจ์‹ (Erosion)AโŠ–BA \ominus B์›๋ณธ ์ด๋ฏธ์ง€ ( A )์—์„œ ๊ตฌ์กฐ ์š”์†Œ ( B )๋ฅผ ๋นผ๋Š” ์—ฐ์‚ฐ.์ด๋ฏธ์ง€์˜ ๊ฒฝ๊ณ„ ์ถ•์†Œ, ์ž‘์€ ๋…ธ์ด์ฆˆ๋‚˜ ๊ฐ์ฒด ์ œ๊ฑฐ.
ํŒฝ์ฐฝ (Dilation)AโŠ•BA \oplus B์›๋ณธ ์ด๋ฏธ์ง€ ( A )์— ๊ตฌ์กฐ ์š”์†Œ ( B )๋ฅผ ๋”ํ•˜๋Š” ์—ฐ์‚ฐ.์ด๋ฏธ์ง€์˜ ๊ฒฝ๊ณ„ ํ™•์žฅ, ์ž‘์€ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ.
์—ด๋ฆผ (Opening)(AโŠ–B)โŠ•B(A \ominus B) \oplus B์นจ์‹ ์—ฐ์‚ฐ ํ›„ ํŒฝ์ฐฝ ์—ฐ์‚ฐ์„ ์ ์šฉ.์ž‘์€ ๋…ธ์ด์ฆˆ๋‚˜ ๊ฐ์ฒด ์ œ๊ฑฐ ํ›„ ์›๋ž˜์˜ ํฐ ๊ฐ์ฒด ๋ณต์›.
๋‹ซํž˜ (Closing)(AโŠ•B)โŠ–B(A \oplus B) \ominus BํŒฝ์ฐฝ ์—ฐ์‚ฐ ํ›„ ์นจ์‹ ์—ฐ์‚ฐ์„ ์ ์šฉ.์ž‘์€ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ ํ›„ ์›๋ž˜์˜ ํฐ ๊ฐ์ฒด์˜ ๊ฒฝ๊ณ„ ๋ณต์›.
๊ทธ๋ ˆ๋””์–ธํŠธ (Gradient)(AโŠ•B)โˆ’(AโŠ–B)(A \oplus B) - (A \ominus B)ํŒฝ์ฐฝ ์—ฐ์‚ฐ๊ณผ ์นจ์‹ ์—ฐ์‚ฐ์˜ ์ฐจ์ด.์ด๋ฏธ์ง€์˜ ๊ฒฝ๊ณ„๋‚˜ ์™ธ๊ณฝ์„  ๊ฐ•์กฐ.
ํ†ฑํ–‡ (Top-Hat)Aโˆ’(AโŠ–B)A - (A \ominus B)์›๋ณธ ์ด๋ฏธ์ง€์™€ ์—ด๋ฆผ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ์˜ ์ฐจ์ด.๋ฐ์€ ๋ฐฐ๊ฒฝ ์œ„์˜ ์ž‘์€ ์–ด๋‘์šด ๊ฐ์ฒด๋‚˜ ๋…ธ์ด์ฆˆ ๊ฐ•์กฐ.
๋ธ”๋ž™ํ–‡ (Black-Hat)(AโŠ•B)โˆ’A(A \oplus B) - A์›๋ณธ ์ด๋ฏธ์ง€์™€ ๋‹ซํž˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ์˜ ์ฐจ์ด.์–ด๋‘์šด ๋ฐฐ๊ฒฝ ์œ„์˜ ์ž‘์€ ๋ฐ์€ ๊ฐ์ฒด๋‚˜ ๋…ธ์ด์ฆˆ ๊ฐ•์กฐ.
ํžˆํŠธ๋ฏธ์Šค (Hit-or-Miss)(AโŠ–B1)โˆฉ(AcโŠ–B2)(A \ominus B_1) \cap ({A^c} \ominus B_2)์›๋ณธ ์ด๋ฏธ์ง€์—์„œ "ํžˆํŠธ" ํŒจํ„ด์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„๊ณผ "๋ฏธ์Šค" ํŒจํ„ด์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ์ฐพ๋Š” ์—ฐ์‚ฐ.๋ฐ”์ด๋„ˆ๋ฆฌ ์ด๋ฏธ์ง€์—์„œ ํŠน์ • ํŒจํ„ด์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉ.

0๊ฐœ์˜ ๋Œ“๊ธ€