Color Threshold

A idéia deste exemplo é colorir partes de uma imagem em escala de cinza com alguma cor, objetivando destacar certa região. Uma aplicação precisa destacar regiões mais prováveis de encontrarmos água a partir de uma imagem em escala de cinza. Tomando o rio como referência, podemos usar os tons presente neste para definir os intervalos de thresholding. Assim, há maior probabilidade de encontrarmos água nas regiões pintadas:

Para fazer isso, usamos a função abaixo, que recebe uma imagem em escala de cinzas, o intervalo dos pontos de corte utilizados para segmentar quais valores da escala serão coloridos e a cor para pintar a região.

def color_threshold(im, rr, cc):
    """
    Convert a range of grayscale values in a RGB color.
 
    Parameters
    ----------
    * im: image (numpy matrix)
    * rr: range of threshold (2 elements tuple)
    * cc: RGB color (3 elemnts tuple -- (R,G,B) )
 
    Written by Pedro Garcia Freitas [sawp@sawp.com.br]
    Copyright 2010 by Pedro Garcia Freitas
 
    see: http://www.sawp.com.br
    """
    inputR = im
    inputG = im
    inputB = im
    R = cc[0]
    G = cc[1]
    B = cc[2]
    Om = zeros((im.shape[0], im.shape[1], 3))
    for i in xrange(rr[0], rr[1]):
        inputR = (inputR == i).choose(inputR, R)
        inputG = (inputG == i).choose(inputG, G)
        inputB = (inputB == i).choose(inputB, B)
    Om[:,:,0] = inputR
    Om[:,:,1] = inputG
    Om[:,:,2] = inputB
    return Om

Utilizamos esta função da seguinte forma:

if __name__ == "__main__":
    inputim = imread('river.bmp')
    grayrange = (inputim.min(), inputim.min() + 20)
    color = (0xFF, 0x00, 0x00)
    outputim = color_threshold(inputim, grayrange, color)
    imsave('colored.bmp', outputim)

Este exemplo está disponível em http://www.sawp.com.br/code/ip/pots49_color_threashold.zip