Se
pretende realizar la segmentación de una imagen en escala de grises a binaria.
Para ello previamente necesitamos tener conocimientos básicos de la manipulación de imágenes con python, en las entradas anteriores aprendemos a abrir una imagen, transformarla a escala de grises y extraer el histograma de una imagen.
El umbral es la suma de todos los pixeles (si hablas de una imagen en escala de grises).
Para binarizar una imagen es decir convertirla solo a blanco y negro, se compara cada uno de los pixeles en escala de grises con el umbral, por ejemplo, si el pixel tiene el valor de 144 y el umbral es de 150 se realiza la siguiente validacion:
si el valor del pixel es mayor a el umbral el valor será 1
si el valor del pixel es menor a el umbral el valor será 0
haciendo estas validaciones el valor se sustituirá con el nuevo valor en la posición validada.
CÓDIGO
from PIL import Image
# Cargar imagen
foto=Image.open('C:/Users/notblu/Documents/Python/practica3/img.png')
dimensiones = foto.size #Extraer dimensiones
foto.show()
#Convertir a escala de grises
if foto.mode != 'L':
foto=foto.convert('L')
seg = foto # Copiar imagen original a variable
i=0
sumseg = 0
# Extraer la suma de la matriz
while i < seg.size[0]:
j = 0
while j < seg.size[1]:
sumseg = sumseg + seg.getpixel((i,j))
j+=1
i+=1
tamImg = seg.size[0] * seg.size[1] # Extrae los pixeles totaless de la imagen
sumseg = int(sumseg / tamImg) # Se obtiene el umbral
umbral=sumseg #se define el umbral
datos=foto.getdata()
datos_binarios=[]
for x in datos:
if x<umbral:
datos_binarios.append(0)
continue
#si es mayor o igual a umbral se agrega 1 en ves de 0
#podria hacerse con 255 en ves de 1
datos_binarios.append(1)
#en caso de utilizar 255 como valor superior el metodo new
#llevaria 'L' en ves de '1' en el primer argumento
nueva_imagen=Image.new('1',dimensiones)
nueva_imagen.putdata(datos_binarios)
nueva_imagen.show()
nueva_imagen.save('binaria.png')
foto.show()
EJECUCIÓN
DESCARGA
No hay comentarios:
Publicar un comentario