Introdução
Este laboratório demonstrará como usar o widget RangeSlider no Matplotlib para controlar o limiar de uma imagem. O objetivo do limiar (thresholding) é converter uma imagem em tons de cinza em uma imagem binária, onde os pixels são pretos ou brancos. Isso é útil para a segmentação de imagens, onde queremos extrair certas características da imagem.
Dicas para a VM
Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.
Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido às limitações do Jupyter Notebook.
Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.
Gerar uma imagem falsa
Primeiramente, geraremos uma imagem em tons de cinza falsa usando o módulo random do NumPy. Definiremos a semente (seed) para garantir que os resultados sejam reproduzíveis.
np.random.seed(19680801)
N = 128
img = np.random.randn(N, N)
Exibir a imagem e seu histograma
Em seguida, exibiremos a imagem usando a função imshow do Matplotlib e seu histograma usando hist. Criaremos uma figura com dois subplots, um para a imagem e outro para o histograma.
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('Histograma das intensidades dos pixels')
Criar o RangeSlider
Agora criaremos o widget RangeSlider, que nos permitirá ajustar o limiar (threshold) da imagem. Criaremos um novo eixo para o slider e o adicionaremos à figura.
slider_ax = fig.add_axes([0.20, 0.1, 0.60, 0.03])
slider = RangeSlider(slider_ax, "Threshold", img.min(), img.max())
Adicionar linhas verticais ao histograma
Para facilitar a visualização do efeito do thresholding, adicionaremos linhas verticais ao histograma para indicar os valores atuais do limiar. Criaremos duas linhas para os valores de limiar inferior e superior, respectivamente.
lower_limit_line = axs[1].axvline(slider.val[0], color='k')
upper_limit_line = axs[1].axvline(slider.val[1], color='k')
Criar uma função de callback para o slider
Criaremos uma função de callback que será chamada sempre que o usuário alterar os valores do limiar usando o slider. A função atualizará o colormap da imagem e as posições das linhas verticais no histograma.
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)
Exibir a figura
Finalmente, exibiremos a figura com a imagem e o slider.
plt.show()
Resumo
Neste laboratório, demonstramos como usar o widget RangeSlider no Matplotlib para controlar o limiar (thresholding) de uma imagem. Mostramos como criar uma imagem em escala de cinza (grayscale) falsa, exibi-la e seu histograma, criar um slider para ajustar os valores do limiar e atualizar a imagem e o histograma com base nos valores do slider. Essa técnica pode ser usada para segmentação de imagem e outras aplicações onde precisamos extrair certas características de uma imagem.