© 2010 Jorge Rodríguez Araújo

1. Método Otsu
1.1 Introducción
El método de segmentación más simple es la umbralización, donde por medio de la generación de una imagen binaria se busca separar entre objetos y fondo.

1.2 Umbralización
En la umbralización se transforma una imagen en escala de grises a binaria, según el valor de cada "pixel" es mayor o menor que el valor de un determinado umbral ("threshold").
# Aplica la umbralización al "array" de la imagen def threshold(img, thr, width, height): # Límites de procesado en x x_min, x_max = 0, width # Límites de procesado en y y_min, y_max = 0, height # Imagen de salida img_out = zeros(width * height) # Procesado de la imagen loc = 0 # Posición del "pixel" actual for y in arange(y_min, y_max): for x in arange(x_min, x_max): loc = y * width + x if img[loc] > thr : img_out[loc] = 255 else: img_out[loc] = 0 return img_out

1.3 Método Otsu
El problema de la umbralización reside en la determinación del valor umbral que segmenta la imagen. Donde el método Otsu es uno de los más utilizados en la determinación automática del umbral de segmentación. Este método proporciona el umbral óptimo ("threshold") para la segmentación de la imagen, bajo el criterio de máxima varianza entre fondo ("background") y objeto ("foreground"). Así, se calcula la varianza entre todas las posibles divisiones, y se toma el umbral que presenta la máxima varianza entre clases, de tal modo que:

T =max 2
2 2

[umbral óptimo]

siendo

 =w B  B−  w F  F − 

2

[varianza]

w k =∑ p i
i=0

k

[probabilidad acumulada]

<grrodri@gmail.com>

1

© 2010 Jorge Rodríguez Araújo
k

 k =∑ i⋅p i
i =0

[media acumulada]

 c=
Donde

k k

[media de la clase (B o F)]

p i es la probabilidad de aparición de un determinado nivel i .

# Calcula el umbral óptimo por el método de Otsu. def otsu_threshold(histogram): # Vector de probabilidad acumulada. omega = zeros(256) # Vector de media acumulada. mean = zeros(256) # Partiendo del histograma normalizado se calculan la probabilidad # acumulada (omega) y la media acumulada (mean). omega[0] = histogram[0] for i in arange(len(histogram)): omega[i] = omega[i-1] + histogram[i] mean[i] = mean[i-1] + i * histogram[i] sigmaB2 = 0 mt = mean[len(histogram)-1] # Valor de la intensidad media de la imagen sigmaB2max = 0 T = 0 for i in arange(len(histogram)): clase1 = omega[i] clase2 = 1 - clase1 if clase1 != 0 and clase2 != 0: m1 = mean[i] / clase1 m2 = (mt - mean[i]) / clase2 sigmaB2 = (clase1 * (m1 - mt) * (m1 - mt) + clase2 * (m2 - mt) * (m2 - mt)) if sigmaB2 > sigmaB2max: sigmaB2max = sigmaB2 T = i return int(T)

1.4 Ejemplo de aplicación
Para demostrar la eficacia del método Otsu de umbralización se aplica a una imagen en la que se encuentran presentes una serie de granos de arroz.
if __name__ == '__main__': import Image from pylab import * im = Image.open('rice.tif') width, height = im.size # Histograma normalizado hist = array(im.histogram(), float) / (width * height) img = array(im.getdata()) thr = otsu_threshold(hist) img_thr = threshold(img, thr, width, height) figure() gray() subplot(121) imshow(img.reshape(height, width))

<grrodri@gmail.com>

2

© 2010 Jorge Rodríguez Araújo

subplot(122) imshow(img_thr.reshape(height, width)) savefig('threshold.png') print thr

125

<grrodri@gmail.com>

3

Sign up to vote on this title
UsefulNot useful