You are on page 1of 3

© 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 [umbral óptimo]
siendo
2 2 2
 =w B  B−  w F  F −  [varianza]
k
w k =∑ p i [probabilidad acumulada]
i=0

<grrodri@gmail.com> 1
© 2010 Jorge Rodríguez Araújo

k
 k =∑ i⋅p i [media acumulada]
i =0

k
 c= [media de la clase (B o F)]
k
Donde 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

You might also like