RangeSlider 를 이용한 이미지 임계값 처리

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Matplotlib 의 RangeSlider 위젯을 사용하여 이미지의 임계값을 제어하는 방법을 보여줍니다. 임계값 처리의 목적은 흑백 이미지를 이진 이미지로 변환하는 것입니다. 여기서 픽셀은 검정색 또는 흰색입니다. 이는 이미지 분할에 유용하며, 이미지에서 특정 특징을 추출하려는 경우에 사용됩니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 액세스하십시오.

때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한 사항으로 인해 작업의 유효성 검사는 자동화할 수 없습니다.

학습 중에 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 문제를 즉시 해결해 드리겠습니다.

가짜 이미지 생성

먼저, NumPy 의 random 모듈을 사용하여 가짜 흑백 이미지를 생성합니다. 결과를 재현 가능하게 하기 위해 시드 (seed) 를 설정합니다.

np.random.seed(19680801)
N = 128
img = np.random.randn(N, N)

이미지 및 히스토그램 표시

다음으로, Matplotlib 의 imshow 함수를 사용하여 이미지를 표시하고, hist를 사용하여 히스토그램을 표시합니다. 이미지와 히스토그램을 위한 두 개의 서브플롯 (subplot) 이 있는 figure 를 생성합니다.

fig, axs = plt.subplots(1, 2, figsize=(10, 5))
fig.subplots_adjust(bottom=0.25)

im = axs[0].imshow(img)
axs[1].hist(img.flatten(), bins='auto')
axs[1].set_title('Histogram of pixel intensities')

RangeSlider 생성

이제 이미지의 임계값을 조정할 수 있는 RangeSlider 위젯을 생성합니다. 슬라이더 (slider) 를 위한 새로운 축 (axis) 을 생성하고 figure 에 추가합니다.

slider_ax = fig.add_axes([0.20, 0.1, 0.60, 0.03])
slider = RangeSlider(slider_ax, "Threshold", img.min(), img.max())

히스토그램에 수직선 추가

임계값 설정의 효과를 더 쉽게 확인하기 위해, 현재 임계값 (threshold value) 을 나타내는 수직선 (vertical line) 을 히스토그램에 추가합니다. 하한 및 상한 임계값에 대해 각각 두 개의 선을 생성합니다.

lower_limit_line = axs[1].axvline(slider.val[0], color='k')
upper_limit_line = axs[1].axvline(slider.val[1], color='k')

슬라이더 (slider) 를 위한 콜백 함수 생성

사용자가 슬라이더를 사용하여 임계값 (threshold value) 을 변경할 때마다 호출될 콜백 함수 (callback function) 를 생성합니다. 이 함수는 이미지의 colormap 과 히스토그램의 수직선 위치를 업데이트합니다.

def update(val):
    ## The val passed to a callback by the RangeSlider will
    ## be a tuple of (min, max)

    ## Update the image's colormap
    im.norm.vmin = val[0]
    im.norm.vmax = val[1]

    ## Update the position of the vertical lines
    lower_limit_line.set_xdata([val[0], val[0]])
    upper_limit_line.set_xdata([val[1], val[1]])

    ## Redraw the figure to ensure it updates
    fig.canvas.draw_idle()


slider.on_changed(update)

그림 표시

마지막으로, 이미지와 슬라이더가 포함된 그림을 표시합니다.

plt.show()

요약

이 랩 (lab) 에서는 Matplotlib 의 RangeSlider 위젯 (widget) 을 사용하여 이미지의 임계값 (thresholding) 을 제어하는 방법을 시연했습니다. 가짜 흑백 이미지 (grayscale image) 를 생성하고, 해당 이미지와 히스토그램을 표시하고, 임계값을 조정하기 위한 슬라이더를 생성하고, 슬라이더 값에 따라 이미지와 히스토그램을 업데이트하는 방법을 보여주었습니다. 이 기술은 이미지 분할 (image segmentation) 및 이미지에서 특정 특징을 추출해야 하는 다른 응용 프로그램에 사용할 수 있습니다.