HOME/Articles/

pil example vision (snippet)

Article Outline

Python pil example 'vision'

Functions in program:

  • def main():
  • def convolucion():
  • def filtro(): #Filtrada por el metodo de los vecinos
  • def umbrales(): # Funcion para los umbrales
  • def escalagrises(): # Funcion para hacer a escala de grises
  • def window():

Modules used in program:

  • import math
  • import time
  • import sys
  • import numpy #Libreria para arreglos
  • import pygame # interfaz

python vision

Python pil example: vision

#!/usr/bin/env python

import pygame  # interfaz
from pygame.locals import *  # para funcion de botones y raton
from pygame import * 
from PIL import Image # Para cargar imagen
from math import *
import numpy  #Libreria para arreglos
import sys
import time
import math

image = str(raw_input('Dame el nombre de la imagen con extencion: ')) # Pedimos imagen

img = Image.open(image) # Abrimos imagen con PIL
width, height = img.size    #Obtencion de medidas de la imagen


def window():
    screen = pygame.display.set_mode((width, height)) # cargar ventana con medidas
    pygame.display.set_caption("window vision") # Mostrar ventana
    background = pygame.image.load(image) # carga de imagen
    #button = pygame.Surface((100, 25))
    screen.blit(background, (0,0)) #posicion de imagen en la ventana
    pygame.display.flip()   #Refrescar pantalla
    while True:  #ciclo para cerrar ventana
        for event in pygame.event.get(): # Para eventos en de pygame
            if event.type == QUIT: #Cerrar ventana
                sys.exit(0)
            if event.type == pygame.KEYDOWN:
               if event.key == pygame.K_g:
                   escalagrises()
                   background = pygame.image.load("grayim.jpg") # carga de imagen
                   screen.blit(background, (0,0)) #posicion de imagen en ventana
                   pygame.display.flip()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_f:
                    filtro()
                    background = pygame.image.load("imfil.jpg") # carga de imagen
                    screen.blit(background, (0,0)) #posicion de imagen en ventana
                    pygame.display.flip()
        if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_c:
                convolucion()
            background = pygame.image.load("sobel.jpg") # carga de imagen
                    screen.blit(background, (0,0)) #posicion de imagen en ventana
                    pygame.display.flip()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_b:
                    umbrales()
                    background = pygame.image.load("bina.jpg") # carga de imagen
                    screen.blit(background, (0,0)) #posicion de imagen en ventana
                    pygame.display.flip()
    return 0

def escalagrises(): # Funcion para hacer a escala de grises
    tiempoInicial = time.time() #para contar el tiempo de ejecucion.
    img = Image.open(image) # Abrimos imagen con PIL
    pixel = img.load()  #Carga de matriz de pixeles
    width, height = img.size    #Obtencion de medidas de la imagen

    for i in range(width):  #Contar pixeles a lo ancho
        for j in range(height):  # Contar pixeles a lo largo
            (r, g, b) = pixel[i,j] 
            gs = int((r + g + b) / 3) 
            pixel [i, j] = (gs, gs, gs)
    img.save("grayim.jpg")
    tiempoFinal = time.time()
    transcurrido = tiempoFinal - tiempoInicial
    print("Tiempo transcurrido durante la escala de grises = ", transcurrido)

def umbrales():  # Funcion para los umbrales
    tiempoInicial = time.time() #para contar tiempo de ejecucion.
    umbraln = 77 # Umbral para color negro en funcion umbral
    umbralb = 177 # Umbral para color blanco en funcion umbral
    img = Image.open("sobel.jpg") # Abrimos imagen con PIL
    pixel = img.load()  #Carga de matriz de pixeles
    width, height = img.size    #Obtencion de medidas de la imagen

    for i in range(width):
        for j in range(height):
        (r, g, b) = pixel[i,j]
            prom = int((r + g + b) / 3)
            if prom < umbraln:
            pixel[i,j] = (0, 0, 0)
        elif prom > umbralb:
            pixel[i,j] = (255, 255, 255)
            else:   
                pixel[i,j] = (prom, prom, prom)  
    #img.save("umb.png")           
    img.save("bina.jpg")
    tiempoFinal = time.time()    
    transcurrido = tiempoFinal - tiempoInicial
    print("Tiempo transcurrido durante la binarizacion = ", transcurrido)

def filtro(): #Filtrada por el metodo de los vecinos
    tiempoInicial = time.time()
        img = Image.open("grayim.jpg")
    width, height = img.size
    pixel = img.load() 
    promedio = 0
    width = width-1
    height = height-1

    for x in range(height):
        for y in range(width):
            #esquina superior izquierda
            if y == 0 and x == 0:
                promedio = (sum(pixel[y + 1,x])/3 + sum(pixel[y,x + 1])/3 + sum(pixel[y,x])/3)/3
            #esquina superior derecha
            if y == width and x == 0:
                promedio = (sum(pixel[y,x+1])/3 + sum(pixel[y-1,x])/3 + sum(pixel[y,x])/3)/3
                        # esquina inferior izquierda
            if y == 0 and x == height:
                 promedio = (sum(pixel[y,x-1])/3 + sum(pixel[y+1,x])/3 + sum(pixel[y,x])/3)/3
                        #esquina inferior derecha
            if y == height and x == width:
                 promedio = (sum(pixel[y - 1,x])/3 + sum(pixel[y,x - 1])/3 + sum(pixel[y,x])/3)/3
                        #barra de arriba
            if y > 0 and y < width and x == 0:
                promedio = (sum(pixel[y+1,x])/3 + sum(pixel[y-1,x])/3 +sum(pixel[y,x+1])/3+ sum(pixel[y,x])/3)/4
                        #barra de abajo
            if y > 0 and y < width and x == height:
                promedio = (sum(pixel[y -1,x])/3 + sum(pixel[y,x-1])/3 +sum(pixel[y+1,x])/3+ sum(pixel[y,x])/3)/4
                        #barra lateral izquierda
            if x >0 and x <height and y == 0:
                promedio = (sum(pixel[y+1,x])/3 + sum(pixel[y,x-1])/3 +sum(pixel[y,x +1])/3+ sum(pixel[y,x])/3)/4
                        #barra lateral derecha
            if y == width and x >0 and x < height:
                promedio = (sum(pixel[y - 1,x])/3 + sum(pixel[y,x-1])/3 + sum(pixel[y,x +1])/3+ sum(pixel[y,x])/3)/4
                        #4 vecinos
            if y > 0 and y< width and x>0 and x< height:
                promedio = (sum(pixel[y,x])/3 + sum(pixel[y + 1,x])/3 + sum(pixel[y - 1,x])/3 + sum(pixel[y,x + 1])/3 + sum(pixel[y,x -1])/3)/5    

            a = promedio
            b = promedio
            c = promedio    
            pixel[y, x] = (a,b,c)
    img.save('imfil.jpg')
    tiempoFinal = time.time()    
    transcurrido = tiempoFinal - tiempoInicial
    print("Tiempo transcurrido durante la filtrado = ", transcurrido)


def convolucion():
    tiempoInicial = time.time()
        img = Image.open("imfil.jpg")
    width, height = img.size
    pixel = img.load()
    sobelx = ([-1, 0, 1], [-2, 0, 2], [-1, 0, 1])  #Valor del operador Sobel
    sobely = ([1, 2, 1], [0, 0, 0], [-1, -2, -1])  #en "x" e "y".
    resx = 0
    resy = 0     

    for x in range(height):
        for y in range(width):
            resx = 0
            resy = 0
            if x != 0 and y != 0 and y != width and x != height: #Para obtener un centrado de la mascara.    
                for i in range(3): #Matriz 3x3
                    for j in range(3):
                        try:
                            resgx = sobelx[i][j]*pix[y+j, x+i][1]#gradientes 
                            resgy = sobely[i][j]*pix[y+j, x+i][1]
                        except:
                            resgx = 0
                            resgy = 0

                        resx = resgx+resgx
                        resy = resgy+resy

                expx = pow(resx, 2) #sacamos potencia
                expy = pow(resy, 2) 
                resultadog = int(sqrt(expx+expy)) #sacamos raiz
                if resultadog > 255: #Por si se pasan los valores
                    resultadog = 255

                if resultadog < 0: 
                    resultadog = 0

                pixel[y,x] = (resultadog , resultadog, resultadog)             

    img.save('sobel.jpg')                    
    tiempoFinal = time.time()    
    transcurrido = tiempoFinal - tiempoInicial
    print("Tiempo transcurrido durante la convolucion = ", transcurrido)

def main():
    pygame.init()
    window()
    escalagrises()
    filtro() 
    umbrales()
    normaliza()
main()