이미지 처리나 객체 시각화 작업을 하다 보면 이미지 위에 원을 표시해야 하는 경우가 자주 있습니다. Matplotlib의 Circle 패치와 NumPy를 함께 사용하면 몇 줄의 코드만으로 손쉽게 구현할 수 있습니다.
구현 단계
Matplotlib와 NumPy를 사용해 이미지 위에 원을 그리려면 아래 순서대로 진행하면 됩니다.
그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 여백을 조정합니다.
imread() 함수로 파일에서 이미지를 읽어 배열(array)로 가져옵니다.
NumPy를 이용해 원이 그려질 x, y 좌표 데이터를 생성합니다.
subplots() 메서드로 그림과 서브플롯을 생성합니다.
imshow() 메서드를 사용해 데이터를 2D 래스터 이미지 형태로 화면에 표시합니다.
axis('off')로 불필요한 축을 제거합니다.
현재 축(ax)에 Circle 패치를 추가합니다.
show() 메서드로 최종 결과를 화면에 출력합니다.
예제 코드
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Circle
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
img = plt.imread('bird.jpg')
x = np.random.rand(5) * img.shape[1]
y = np.random.rand(5) * img.shape[0]
fig, ax = plt.subplots(1)
ax.imshow(img)
ax.axis('off')
for xx, yy in zip(x, y):
circ = Circle((xx, yy), 50, color='red')
ax.add_patch(circ)
plt.show()코드 설명
위 예제에서 핵심 부분을 살펴보면 다음과 같습니다.
plt.imread('bird.jpg'): 이미지 파일을 읽어 NumPy 배열로 변환합니다. 배열의 shape는 (높이, 너비, 채널) 형태입니다.
np.random.rand(5): 0과 1 사이의 난수 5개를 생성한 뒤, 이미지의 너비와 높이를 곱해 이미지 범위 안의 좌표를 만듭니다.
Circle((xx, yy), 50, color='red'): 중심 좌표 (xx, yy), 반지름 50픽셀인 빨간색 원을 정의합니다. 필요에 따라 fill=False, linewidth 등의 옵션으로 테두리만 있는 원도 그릴 수 있습니다.
ax.add_patch(circ): 생성한 원 패치를 현재 축에 추가해 실제로 화면에 나타나도록 합니다.
실행 결과
코드를 실행하면 새 이미지 위에 빨간색 원 5개가 무작위 위치에 표시됩니다. 이 기법은 객체 검출 결과 시각화, 관심 영역(ROI) 표시 등 다양한 컴퓨터 비전 작업에 응용할 수 있습니다.