Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

NumPy와 Matplotlib로 이미지 분할 오버레이 구현하는 방법

이미지 처리 작업에서 세그멘테이션(분할) 결과를 원본 이미지 위에 겹쳐서 시각화하면 영역을 직관적으로 확인할 수 있습니다. 이 글에서는 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 반투명하게 겹쳐서 분할 영역을 강조합니다.

실행 결과

위 코드를 실행하면 좌측에는 노이즈가 포함된 원본 이미지가, 우측에는 분할 영역이 컬러 오버레이로 강조된 이미지가 나란히 표시됩니다. 이 방식은 의료 영상 분석, 객체 검출 결과 시각화 등 다양한 이미지 세그멘테이션 작업에 응용할 수 있습니다.