SciPy 엣지 검출과 히스토그램 분석: SciPy.ndimage를 활용한 이미지 처리
이미지 처리 분야에서는 엣지 검출과 히스토그램 분석이 중요한 역할을 합니다. 엣지 검출은 이미지 내에서 객체의 경계를 식별하는 과정이며, 히스토그램 분석은 이미지의 픽셀 값 분포를 분석하는 방법입니다. 이번 포스팅에서는 Python의 SciPy 라이브러리를 활용해 엣지 검출과 히스토그램 분석을 수행하는 방법을 자세히 살펴보겠습니다.
1. SciPy.ndimage 소개
SciPy의 ndimage
모듈은 다차원 이미지 처리 기능을 제공하는 서브패키지입니다. 이를 통해 다양한 필터링, 변환, 측정, 형태학적 작업 등을 수행할 수 있습니다. 특히, 엣지 검출과 이미지 분석에 유용한 기능들이 잘 제공됩니다.
먼저, SciPy와 함께 필요한 패키지를 설치하고 불러오는 과정부터 시작하겠습니다.
# 필수 패키지 설치
# !pip install scipy matplotlib numpy
import numpy as np
import matplotlib.pyplot as plt
from scipy import ndimage
from skimage import data, color
2. 엣지 검출 (Edge Detection)
엣지 검출은 이미지 내에서 픽셀 값이 급격하게 변하는 부분을 찾는 과정입니다. 일반적으로 다음과 같은 방법을 사용합니다.
(1) 소벨 필터 (Sobel Filter)
소벨 필터는 이미지의 그래디언트를 계산하여 엣지를 강조하는 방법입니다. 수평과 수직 방향의 변화율을 계산하고, 이를 결합하여 최종 엣지를 생성합니다.
# 예제 이미지 불러오기
image = color.rgb2gray(data.coins())
# 소벨 필터 적용
sobel_x = ndimage.sobel(image, axis=0) # 수직 방향
sobel_y = ndimage.sobel(image, axis=1) # 수평 방향
sobel_combined = np.hypot(sobel_x, sobel_y)
# 시각화
plt.figure(figsize=(12, 8))
plt.subplot(1, 3, 1)
plt.imshow(sobel_x, cmap='gray')
plt.title('소벨 필터 - 수직 방향')
plt.axis('off')
plt.subplot(1, 3, 2)
plt.imshow(sobel_y, cmap='gray')
plt.title('소벨 필터 - 수평 방향')
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(sobel_combined, cmap='gray')
plt.title('소벨 필터 - 결합')
plt.axis('off')
plt.tight_layout()
plt.show()
소벨 필터는 노이즈에 민감하므로, 사전에 가우시안 블러(Gaussian Blur) 등을 적용해 노이즈를 줄인 후 사용하는 것이 좋습니다.
(2) 라플라시안 필터 (Laplacian Filter)
라플라시안 필터는 2차 미분을 이용해 엣지를 찾는 방법으로, 고주파 성분을 강조하는 특징이 있습니다.
# 라플라시안 필터 적용
laplacian = ndimage.laplace(image)
plt.figure(figsize=(6, 6))
plt.imshow(laplacian, cmap='gray')
plt.title('라플라시안 필터 적용 결과')
plt.axis('off')
plt.show()
(3) 프리윗 필터 (Prewitt Filter)
프리윗 필터는 소벨 필터와 유사하지만, 더 단순한 형태의 마스크를 사용합니다.
# 프리윗 필터 적용
prewitt_x = ndimage.prewitt(image, axis=0)
prewitt_y = ndimage.prewitt(image, axis=1)
prewitt_combined = np.hypot(prewitt_x, prewitt_y)
plt.figure(figsize=(12, 8))
plt.subplot(1, 3, 1)
plt.imshow(prewitt_x, cmap='gray')
plt.title('프리윗 필터 - 수직 방향')
plt.axis('off')
plt.subplot(1, 3, 2)
plt.imshow(prewitt_y, cmap='gray')
plt.title('프리윗 필터 - 수평 방향')
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(prewitt_combined, cmap='gray')
plt.title('프리윗 필터 - 결합')
plt.axis('off')
plt.tight_layout()
plt.show()
3. 히스토그램 분석
히스토그램 분석은 이미지 내 픽셀 값의 분포를 시각적으로 표현하는 방법입니다. 이를 통해 이미지의 밝기, 대비 등을 분석할 수 있습니다.
(1) 히스토그램 생성
# 히스토그램 생성
plt.figure(figsize=(10, 6))
plt.hist(image.ravel(), bins=256, range=[0, 1], color='gray', alpha=0.7)
plt.title('이미지 픽셀 값 히스토그램')
plt.xlabel('픽셀 값')
plt.ylabel('빈도')
plt.grid(True)
plt.show()
(2) 히스토그램 평탄화
히스토그램 평탄화는 이미지의 대비를 개선하는 방법으로, 픽셀 값의 분포를 균일하게 조정합니다.
# 히스토그램 평탄화
from skimage import exposure
image_equalized = exposure.equalize_hist(image)
# 원본과 평탄화된 이미지 비교
plt.figure(figsize=(12, 8))
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('원본 이미지')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(image_equalized, cmap='gray')
plt.title('히스토그램 평탄화 이미지')
plt.axis('off')
plt.tight_layout()
plt.show()
4. 결론
이번 포스팅에서는 SciPy의 ndimage
모듈을 활용해 엣지 검출과 히스토그램 분석을 수행하는 방법을 알아보았습니다. 엣지 검출을 통해 이미지 내 경계를 효과적으로 식별하고, 히스토그램 분석을 통해 픽셀 값의 분포와 대비를 개선할 수 있습니다.
이러한 방법은 이미지의 품질을 높이고, 후속 이미지 처리 작업의 정확도를 개선하는 데 큰 도움이 됩니다. 다음 포스팅에서는 이미지의 형태학적 변환과 특징 추출 방법에 대해 다룰 예정입니다.
'Python SciPy' 카테고리의 다른 글
SciPy 최적화와 통계를 결합한 데이터 분석 (0) | 2025.03.31 |
---|---|
SciPy 레이블링과 객체 분석 (SciPy.ndimage) (0) | 2025.03.30 |
SciPy 이미지 필터링과 변형 (0) | 2025.03.28 |
SciPy 델로니 삼각 분할과 보로노이 다이어그램 (0) | 2025.03.27 |
SciPy 볼록 껍질(Convex Hull) (0) | 2025.03.26 |