본문 바로가기
Machine Learning/Image Processing

8. [Python] Morpological Transfomation

by 베짱이28호 2022. 8. 15.

8. [Python] Morpological Transfomation

  • Convolution 기반의 Morphological Operations 알아보기.
from configs.config import DATA_PATH
import matplotlib.pyplot as plt
import numpy as np
import cv2
import os

path = os.path.join(DATA_PATH, 'images', 'image6.jpg')
img = cv2.imread(path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_gray = cv2.imread(path,cv2.IMREAD_GRAYSCALE)
img_ycrcb = cv2.cvtColor(img,cv2.COLOR_RGB2YCrCb)

1. Erosion, Dilation

  • Erosion
    • Pixel wise 연산으로 커널이 이미지의 각 픽셀 위를 슬라이딩하면서, 커널이 겹치는 영역에서 최소값을 픽셀로 설정.
    • 커널 내에서 최소값을 찾아 그 값을 중심 픽셀에 대입하는 방식.
    • 밝은 영역을 줄이고, 어두운 영역을 확장합니다. (객체가 얇아짐)
  • Dilation
    • 커널이 이미지의 각 픽셀 위를 슬라이딩하면서, 커널이 겹치는 영역에서 최댓값을 픽셀로 설정.
    • 즉, 커널 내에서 최대값을 찾아 그 값을 중심 픽셀에 대입하는 방식.
    • 밝은 영역을 확장하고, 어두운 영역을 줄인다. (객체의 경계가 두꺼워짐)
img_gray = 255-img_gray
kernel = np.ones((5,5), np.uint8)

erosion = cv2.erode(img_gray, kernel, iterations=1)
dilation = cv2.dilate(img_gray, kernel, iterations=1)

operations = [
    ('Original Binary Image', img_gray),
    ('Erosion', erosion),
    ('Dilation', dilation)
]

plt.figure(figsize=(12,4))

for i, (title, image) in enumerate(operations, start=1):
    plt.subplot(1,3,i)
    plt.imshow(image, cmap='gray')
    plt.title(title)
    plt.axis('off')

plt.tight_layout()
plt.show()

  • 보통 Gray Scale에서 사용하고, 연산 후 픽셀의 밝기가 변한다.
  • 주변 픽셀 밝기의 최대, 최소값들을 할당하기 때문에 경계선이 변화한다.
  • 원래 흰색이 이미지인데, 정보를 담고있는게 white인 경우가 더 설명에 잘 어울려서 색상 반전.
  • Erision이나 Dilation 이름보다 이미지의 특성(밝기)에 따라서 어떤 연산을 적용할지 생각하자.
    • erision은 검은 영역 확장, Dilation은 흰색 영역 확장.

2. Opening, Closing

  • Opening
    • Erosion -> Dilation 수행
    • 작은 노이즈를 제거하고 객체의 경계선을 매끄럽게 만듦.
  • Closing
    • Dilation -> Erosion 수행
    • 작은 구멍이나 검은 픽셀 영역을 채우고 객체의 경계를 선명하게 만듦.
path = os.path.join(DATA_PATH, 'images', 'image6.jpg')
img = cv2.imread(path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_gray = cv2.imread(path,cv2.IMREAD_GRAYSCALE)
img_ycrcb = cv2.cvtColor(img,cv2.COLOR_RGB2YCrCb)

opening = cv2.morphologyEx(img_gray, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(img_gray, cv2.MORPH_CLOSE, kernel)

operations = [
    ('Original Binary Image', img_gray),
    ('Opening', cv2.morphologyEx(img_gray, cv2.MORPH_OPEN, kernel)),
    ('Closing', cv2.morphologyEx(img_gray, cv2.MORPH_CLOSE, kernel))
]


plt.figure(figsize=(12,4))

for i, (title, image) in enumerate(operations, start=1):
    plt.subplot(1,3,i)
    plt.imshow(image, cmap='gray')
    plt.title(title)
    plt.axis('off')

plt.tight_layout()
plt.show()

 


3. Gradient, Tophat, Blackhat

  • Gradient = Dilation - Erosion
    • 객체의 외곽선이나 경계를 강조해줍니다.
  • Top Hat
    • Top Hat = 원본 이미지 - Opening
    • Top Hat은 Opening 이후 남은 작은 객체나 밝은 부분을 강조.
  • Black Hat
    • Black Hat = Closing - 원본 이미지\
    • Black Hat은 Closing 이후 남은 작은 어두운 객체나 구조를 강조.
gradient = cv2.morphologyEx(img_gray, cv2.MORPH_GRADIENT, kernel)
tophat = cv2.morphologyEx(img_gray, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(img_gray, cv2.MORPH_BLACKHAT, kernel)

operations = [
    ('Original Binary Image', img_gray),
    ('gradient', gradient),
    ('tophat', tophat),
    ('blackhat', blackhat)
]

plt.figure(figsize=(12,4))

for i, (title, image) in enumerate(operations, start=1):
    plt.subplot(1,4,i)
    plt.imshow(image, cmap='gray')
    plt.title(title)
    plt.axis('off')

plt.tight_layout()
plt.show()

 

  • 이미지가 밝은 이미지에 어두운 값으로 정보가 들어간건지, 어두운 이미지에 밝은 값으로 정보가 들어간건지에 따라서 의미가 달라질 수 있다.
  • 연산들을 여러 개 확인해보거나, 영상 특성에 맞게 메서드를 골라서 사용하기.

'Machine Learning > Image Processing' 카테고리의 다른 글

10. [Python] Image Segmentation  (0) 2022.08.29
9. [Python] Image Transform  (0) 2022.08.25
7. [Python] Thresholding  (0) 2022.08.08
6. [Python] Image Compression  (0) 2022.08.05
5. [Python] Histogram Modeling  (0) 2022.07.28
4. [Python] Frequency Domain  (0) 2022.07.22
3. [Python] Spatial Domain  (0) 2022.07.13

댓글