이미지 처리 작업에서 세그멘테이션(분할) 결과를 원본 이미지 위에 겹쳐서 시각화하면 영역을 직관적으로 확인할 수 있습니다. 이 글에서는 NumPy의 마스크드 배열(masked array)과 Matplotlib를 활용해 이미지 분할 오버레이를 구현하는 방법을 단계별로 소개합니다.
구현 절차
10×10 크기의 마스크드 배열(masked array)을 생성합니다.
특정 영역에 해당하는 부분의 값을 1로 업데이트합니다.
NumPy를 사용해 이미지 데이터를 만듭니다.
조건이 충족되는 위치를 마스킹하여 마스크된 데이터를 얻습니다.
figure() 메서드로 새 figure를 생성하거나 기존 figure를 활성화합니다.
imshow() 메서드를 사용해 데이터를 2D 래스터(raster) 형태의 이미지로 표시합니다.
show() 메서드로 완성된 그림을 화면에 출력합니다.
예제 코드
from matplotlib import pyplot as plt import numpy as np plt.rcParams["figure.figsize"] = [7.00, 3.50] plt.rcParams["figure.autolayout"] = True mask = np.zeros((10, 10)) mask[3:-3, 3:-3] = 1 im = mask + np.random.randn(10, 10) * 0.01 masked = np.ma.masked_where(mask == 0, mask) plt.figure() plt.subplot(1, 2, 1) plt.imshow(im, 'gray', interpolation='none') plt.subplot(1, 2, 2) plt.imshow(im, 'gray', interpolation='none') plt.imshow(masked, 'jet', interpolation='none', alpha=0.7) plt.show()
코드 설명
먼저 np.zeros((10, 10))으로 모든 값이 0인 10×10 배열을 만들고, mask[3:-3, 3:-3] = 1을 통해 중앙 영역만 1로 설정합니다. 이후 난수 노이즈를 더해 실제 이미지처럼 보이는 데이터 im을 생성합니다.
np.ma.masked_where(mask == 0, mask)는 값이 0인 위치를 마스킹하여, 오버레이 시 해당 영역은 투명하게 유지되고 분할된 중앙 영역만 색상으로 표시되도록 합니다.
왼쪽 서브플롯에는 원본 이미지만 회색조(grayscale)로 출력하고, 오른쪽 서브플롯에는 동일한 이미지 위에 'jet' 컬러맵으로 마스크를 alpha=0.7 반투명하게 겹쳐서 분할 영역을 강조합니다.
실행 결과
위 코드를 실행하면 좌측에는 노이즈가 포함된 원본 이미지가, 우측에는 분할 영역이 컬러 오버레이로 강조된 이미지가 나란히 표시됩니다. 이 방식은 의료 영상 분석, 객체 검출 결과 시각화 등 다양한 이미지 세그멘테이션 작업에 응용할 수 있습니다.