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 |
댓글