método otsu

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 =w B B 2 w F F 2 [varianza] w k = i =0 k p i [probabilidad acumulada] <[email protected]> 1

Upload: jorge-rodriguez-araujo

Post on 27-Jun-2015

2.204 views

Category:

Documents


3 download

DESCRIPTION

Umbralización de una imagen en escala de grises

TRANSCRIPT

Page 1: Método Otsu

© 2010 Jorge Rodríguez Araújo

1. Método Otsu

1.1 IntroducciónEl 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ónEn 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 imagendef 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 OtsuEl 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=wB B− 2w F F− 2 [varianza]

w k=∑i=0

k

p i [probabilidad acumulada]

<[email protected]> 1

Page 2: Método Otsu

© 2010 Jorge Rodríguez Araújo

k=∑i=0

k

i⋅p i [media acumulada]

c= kk

[media de la clase (B o F)]

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ónPara 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))

<[email protected]> 2

Page 3: Método Otsu

© 2010 Jorge Rodríguez Araújo

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

125

<[email protected]> 3