domingo, 23 de octubre de 2016

ECUALIZACIÓN DEL HISTOGRAMA DE UNA IMAGEN

Ecualización del histograma

Dada una imagen MxN, con nk píxeles para cada nivel rk, la ecualización del histograma consiste en realizar la siguiente transformación sobre los niveles de intensidad de la imagen:[1]



Foto 1. Función para la ecualización del histograma 

El fundamento se basa en realizar una conversión en el histograma de forma que la probabilidad de cualquier nivel de gris en la imagen sea idéntica.

Lo que resulta en una dispersión del histograma en un rango mayor dentro del intervalo [0,L-1]. La principal ventaja de este método es que es completamente “automático”.[1]

 Pseudocodigo para la función  ecualización del histograma de una imagen

1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz de tipo uint8 con el tamaño de la imagen .
5.Creamos los vectores Histograma, Probabilidad, SAcumula estos de ceros con un rango de 256  y una nueva matriz para realizar la función de ecualización.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1.Realizamos la función correspondiente para calcular las ocurrencias de nivel de gris en este caso el histograma:
    V = img[i, j] 
         Histograma[V] = Histograma[V] + 1.
7. Realizamos el recorrido  del vector probabilidad con un for solo para filas.
7.1 Realizamos la función correspondiente para calcular la probabilidad en este caso:
        Probabilidad[i]= ( Histograma[i]/Tpixel).
8. Realizamos el recorrido  del vector SAcomula con un for solo para filas.
8.1 Realizamos la función correspondiente para calcular la suma acumulativa en este caso:
        SAcomula[i]= SAcomula[i-1]+Probabilidad[i]
9. Se realiza el recorrido de la matriz nueva para realizar la función de la ecualización con dos ciclos for, una para filas y otro para columnas.
9.1 Realizamos la función correspondiente para calcular la ecualización del histograma  en este caso: 
         imgEcualizada[i,j]=SAcomula [img[i,j]]*255
10. Mostramos la imagen original.
11. Mostramos su histograma con  parámetros necesarios usando la librería Maplotlip.
12. Mostramos la imagen ecualizada.
13. Mostramos su histograma ecualizado con parámetros necesarios usando la librería Maplotlip.
 9. Guardamos Imagen o el histograma si así lo requerimos.
10. Cerramos ventanas.
11. Fin


Código de la función ecualización del histograma de una imagen 


import numpy as np
import numpy 
import cv2
from matplotlib import pyplot as plt

img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Caballo2.jpg',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)

Tpixel=reg*col


Histograma = np.zeros([256],int)
Probabilidad = np.zeros(256)
SAcomula = np.zeros(256)

imgEcualizada=np.zeros((reg,col),dtype=np.uint8)

for in range (reg):
    for j in range (col):
       V = img[i, j]
         Histograma[V] = Histograma[V] + 1

for in range (256):

         Probabilidad[i]= ( Histograma[i]/Tpixel)

for in range (256):

         SAcomula[i]= SAcomula[i-1]+Probabilidad[i]

for in range (reg):
    for j in range (col):
        imgEcualizada[i,j]=SAcomula [img[i,j]]*255

cv2.imshow ('Caballo',img)                         
plt.hist(img.ravel(),256,[0,256], width=5, color='r')
plt.show()    

cv2.imshow('Ecualizada',imgEcualizada)
plt.hist(imgEcualizada.ravel(),256,[0,256], width=5, color='b')
plt.show()    
                
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    plt.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.jpg',g)

    cv2.destroyAllWindows()





    Foto 2. Ejemplo de una imagen original poco contrastada  y su respectivo histograma  



                     
              
                  Foto 3. Ejemplo de la imagen ya ecualizada  y su respectivo histograma 




Referencias

[1]http://alojamientos.us.es/gtocoma/pid/tema1-2.pdf

  Consulta 21 de octubre del 2016





lunes, 10 de octubre de 2016

BIENVENIDOS

Este Blog, esta dedicado a la unidad de aprendizaje "procesamiento digital de imágenes", el cual se incluirán todas las tareas que se realicen en el curso, así como también habrá un apartado para poner algunas dudas que se presenten durante el curso y puedan ser observadas por el profesor.




Cabe mencionar que en el apartado de dudas no solo se pondrán las dudas y preguntas, si no que también se realizaran  notas acerca de los trabajos y las justificaciones necesarias acerca de las tareas en el curso.

COMENTARIOS

PROCESAMIENTO DIGITAL DE IMÁGENES


¿Qué entendemos por imagen?

Una imagen puede ser definida matemáticamente como una función bidimensional,

                                                                        f(x,y),

donde x y y son coordenadas espaciales (en un plano), y f en cualquier par de coordenadas es la intensidad o nivel de gris de la imagen en esa coordenada.[1]


 ¿Qué entendemos por imagen digital?

Cuando x,y, y los valores de f son todas cantidades finitas, discretas, decimos que la imagen es una imagen digital. 

Una imagen digital se compone de un número finito de elementos, cada uno con un lugar y valor específicos. Estos elementos son llamados pels, o pixels.[1]


 ¿Qué es el procesamiento digital de imágenes?

 En el resto de la sección se intentará contestar esta pregunta basándose en el dominio que presentan González y Woods en el libro de texto de la materia .La vista es nuestro sentido más avanzado, y no es sorprendente que las imágenes jueguen el papel más importante en la percepción humana. Aunque los seres humanos estemos limitados a la banda visible del espectro electromagnético (EM), las máquinas pueden percibir casi el espectro completo, desde los rayos gamma, a las ondas de radio. Las máquinas también pueden procesar imágenes generadas por fuentes que los humanos no asociamos con imágenes; como es el caso del ultrasonido, la microscopia de electrones, etc.[1]

Funciones Lineales 

NEGATIVO DE UNA IMAGEN

El negativo de una imagen con niveles de gris en el rango [0, L – 1]se obtiene al utilizar la transformación de negativo, consiste  principalmente en invertir los niveles de intensidad de esta manera produce el equivalente de un negativo fotográfico.[1]

La función  del negativo es :

                      s = L – 1 – r

Donde s es  g(x,y) función de salida
Donde L – 1 es 256-1
Donde  r es la función de entrada en este caso f(x,y)

Finalmente queda:

g(x,y)= 255- f(x,y)

Sirve para mejorar los niveles de blanco o gris en las imágenes donde predomina el oscuro y así puedan ser visibles esas áreas.




                                  Foto 1. Gráfica de la función Negativo una imagen 


Algoritmo o pseudocodigo para la función  negativo de una imagen 

1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
4. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
4.1. Se realiza la función del negativo  en este caso  g [x,y]= 255-img [x,y].
6. Mostramos la imagen original y la imagen Negativa.
7. Guardamos Imagen negativa.
8. Cerramos ventanas.
9. Fin.

Código de la función negativo de una imagen 

import numpy as np
import numpy 
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Caballo.jpg',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)

for i in range (reg):
    for j in range (col):
        g [i,j]= 255-img[i,j]
cv2.imshow ('Caballito',img)                              
cv2.imshow ('Negro',g)                          
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Caballo1.jpg',g)

    cv2.destroyAllWindows()



  

                           Foto 2. Ejemplo de una imagen original  y su respectivo negativo 



AUMENTO DE INTENSIDAD 

La función aumento de intensidad esta también dentro de las funciones lineales, en esta usamos datos como m y b que son los que complementan la ecuación de la recta.

por ende la función aumento de intensidad queda :

g(x,y)= m* f(x,y)+b

es la pendiente de  la recta
b  es el intercepto con el eje y
g(x,y) es la función de salida
f(x,y) es la función de entrada o valor de la imagen de entrada.

Esta función principalmente sirve para aumentar la tonalidad de blancos en imágenes oscuras como las astronómicas. 


                                Foto 3. Gráfica de la función, Aumento de Intensidad de una imagen 



Algoritmo o pseudocodigo para la función  aumento de intensidad



1. Leemos la imagen en escala de grises.

2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
4. Se asignan valores a m y b donde m es la pendiente de la recta y b el intercepto de la recta con el eje  y.
5. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
5.1. Se realiza la función del aumento de intensidad, en este caso  g [x,y]= m* (img [x,y]) + b.
6. Mostramos la imagen original y la imagen de salida con la función  aplicada.
7. Guardamos Imagen con la función aplicada.
8. Cerramos ventanas.
9. Fin.

Código de la función aumento de intensidad 

import numpy as np
import numpy 
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Foto.jpg',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)

b=50

m=0.8

for in range (reg):
    for j in range (col):
       g [i,j]= m*img [i,j]+b

cv2.imshow ('Espacio',img)                              
cv2.imshow ('Negro',g)                          
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.jpg',g)

    cv2.destroyAllWindows()







                   Foto 4. Ejemplo de una imagen original  y su aumento de intensidad


AUMENTO DE CONTRASTE


El efecto de la transformación sería producir una imagen de más alto contraste que la original al oscurecer los niveles de grises blancos y aclarar los niveles de grises poco contrastados de la imagen original. Esta técnica se denomina aumento del contraste.[1]

El aumento de contraste esta dada por al función:

g(x,y)= {0,
            (  ( f(x,y)-Min) * 255)/Max-Min,
             255,
              
Donde:
g(x,y) es la función de salida
f(x,y) es la función de entrada o valor de la imagen de entrada.
Min  es el valor mínimo de grises de la imagen original  
Max  es el valor máximo de grises de la imagen original  

 Esta función de aumento de contraste sirve para darle buen aspecto a las imágenes muy opacas o con poco contraste.

                                         
                              Foto 5. Gráfica de la función, Aumento de contraste de una imagen 


Algoritmo o pseudocodigo para la función  aumento de contraste 


1. Leemos la imagen en escala de grises.

2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
4. Encontramos el valor mínimo y máximo de la imagen original.
5. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
5.1. Se realiza la función del aumento de contraste, en este caso
 if img[i,j]<=Min:
              g[i,j]=0
        if Min<img[i,j]<Max:
              g[i,j]=((img[i,j]-Min)*255)/(Max-Min)
        if img[i,j]>=Max:
             g[i,j]=255
6. Mostramos la imagen original y la imagen de salida con la función  aplicada.
7. Guardamos Imagen con la función aplicada.
8. Cerramos ventanas.
9. Fin.

Código de la función aumento de contraste

import numpy as np
import numpy 
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Ain.jpg',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)

Min= np.min(img)

Max= np.max(img)

for in range (reg):
    for j in range (col):
      if img[i,j]<=Min:
              g[i,j]=0
        if Min<img[i,j]<Max:
              g[i,j]=((img[i,j]-Min)*255)/(Max-Min)
        if img[i,j]>=Max:
             g[i,j]=255

cv2.imshow ('Caballo',img)                              
cv2.imshow ('Negro',g)                          
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.jpg',g)

    cv2.destroyAllWindows()






 Foto 6. Ejemplo de una imagen original  y su aumento de contraste


Transformaciones no lineales 


FUNCIÓN ALGORÍTMICA 

La forma general de la transformación logarítmica es:

 s = c log (1 + r)

Donde c es una constante, y se asume que r >= 05 . 
r es f(x,y) función de entrada 

El efecto de la transformación es mapear un pequeño rango de valores bajos de nivel de gris a un rango más amplio de niveles de salida, al tiempo que lo contrario ocurre con los valores de entrada altos. 
Se usa una transformación de este tipo para expander los valores de pixeles oscuros de una imagen, mientras se comprime los valores de alto valor. La transformación logarítmica inversa lleva a cabo la transformación contraria. [1]



                                        
                                                Foto 7. Gráfica de la función Algorítmica


Algoritmo o pseudocodigo para la función  Algorítmica 

1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
4. Encontramos el valor máximo de la imagen original.
5. Calculamos el valor de la constante  c,  ocupando como dato el valor del máximo.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función algorítmica, en este caso  g[i,j]=c*(math.log(1+img[i,j])).
7. Mostramos la imagen original y la imagen de salida con la función  aplicada.
8. Guardamos Imagen con la función aplicada..
9. Cerramos ventanas.
10. Fin

Código de la función Algorítmica 

import numpy as np
import numpy 
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\IM.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)

Max= np.max(img)

c= 255/(math.log(1+Max))

for in range (reg):
    for j in range (col):
      g[i,j]=c*(math.log(1+img[i,j]))

cv2.imshow ('Foto',img)                              
cv2.imshow ('Negro',g)                          
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)

    cv2.destroyAllWindows()






         Foto 8. Ejemplo de una imagen original  y la aplicación de la función algorítmica. 



FUNCIÓN EXPONENCIAL 


Las transformaciones de función de potencia tienen la forma básica

                                                                s = crγ 

Donde c y γ son constantes positivas. Algunas veces la ecuación se escribe como s = c (r + ε) γ para tomar en cuenta un offset de calibración. [1]

Al variar la γ obtenemos las diversas transformaciones que se grafican en la fig 9

Foto 9. Gráfica de la función Exponencial 

Esta transformación también se utiliza para manipular el contraste de una imagen. 

Algoritmo o pseudocodigo para la función  Exponencial 

1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
5.Asignamos en valor a gamma y calculamos el valor de la constante  c,  ocupando como dato el valor del gamma.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función exponencial, en este caso   g[i,j]=c*(img[i,j]**gamma).
7. Mostramos la imagen original y la imagen de salida con la función  aplicada.
8. Guardamos Imagen con la función aplicada.
9. Cerramos ventanas.
10. Fin

Código de la función Exponencial

import numpy as np
import numpy 
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Cubo.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)

gamma=0.7
c=255/((255)**gamma)

for in range (reg):
    for j in range (col):
        g[i,j]=c*(img[i,j]**gamma)

cv2.imshow ('Cubo',img)                              
cv2.imshow ('Negro',g)                          
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)

    cv2.destroyAllWindows()






    Foto 10. Ejemplo de una imagen original  y la aplicación de la función exponencial.


Funciones de transformación lineal por partes

La principal ventaja de las funciones de transformación lineal por partes es que pueden ser arbitrariamente complejas (pueden tener la forma que queramos). Su desventaja es que su especificación requiere más datos de entrada por parte del usuario.  [1]

EXPANSIÓN DE CONTRASTE  (CASO 1)

La idea del aumento del contraste es estirar el rango dinámico de los niveles de gris que se están procesando. Los puntos de control (r1, s1) y (r2, s2) determinan la forma de la función de transformación.  [1]



Su función esta dada por :


S={αr,
                β(r-a)+Va
                 γ(r-b)+Vb

Si r1 = s1 y r2 = s2 la transformación es una función lineal que no produce cambios en el nivel de gris. 


 Foto 11. Gráfica de la función transformación lineal por partes 


Algoritmo o pseudocodigo para la función expansión de contraste   

1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
5.Asignamos los valores a los registros alfa, beta y gamma, tal que alfa y gamma sean mayor que 1 y beta menor que 1, también asignamos los valores a a y b tal que al graficar esta no sobrepase los 255 ya que si es así aparecerán manchas negras en la imagen que se le aplica la función, también asignamos valores de entradas para Va y Vb.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función de expansión del contraste, en este caso
if 0<=img[i,j]<a:
            g[i,j]=A*img[i,j]
        if a<=img[i,j]<b:
            g[i,j]=B*(img[i,j]-a)+Va
        if b<=img[i,j]<=255:
            g[i,j]=G*(img[i,j]-b)+Vb.
7. Mostramos la imagen original y la imagen de salida con la función  aplicada.
8. Guardamos Imagen con la función aplicada.
9. Cerramos ventanas.
10. Fin


Código de la función Expansión de contraste 

import numpy as np
import numpy 
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\T.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)

A=1.2
B=0.3
G=1.3
a=125
b=195
Va=100
Vb=110
for in range (reg):
    for j in range (col):
        if 0<=img[i,j]<a:
            g[i,j]=A*img[i,j]
        if a<=img[i,j]<b:
            g[i,j]=B*(img[i,j]-a)+Va
        if b<=img[i,j]<=255:
            g[i,j]=G*(img[i,j]-b)+Vb
  

cv2.imshow ('Arbol',img)                              
cv2.imshow ('Negro',g)                          
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)

    cv2.destroyAllWindows()




 Foto 12. Ejemplo de una imagen original  y la aplicación de la función expansión de contraste.


RANGO ESPECIFICO DE NIVEL DE GRIS (CASO 2)

A veces se desea mostrar un rango específico de niveles de gris. Masas de agua en fotos satélitales, una manera de lograr esto es con la transformación lineal por partes llamada fraccionamiento del nivel de gris. [1]

Se muestra un valor alto para todos los valores dentro del rango de interés y un valor bajo para todos los demás.[1]


La función del segundo caso esta dada  por 


S={L-1, si a<=r<=b
                  0, cualquier otro caso  



 Donde  L-1 es 256-1.
a y b son valores asignados por nosotros ya que es donde determinamos el rango.
r  es la función de entrada  en este caso f(x,y).

           Foto 13. Gráfica de la función transformación lineal por partes, Caso 2 Nivel de gris



Algoritmo o pseudocodigo para la función transformación lineal por partes, Caso 2 Nivel de gris.

1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
5. Asignamos los valores a a y b  con valores que nosotros queramos siempre y cuando no sobrepase los 255 ya que es donde se especificara el rango para aplicar el nivel de gris.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función de nivel de gris, en este caso
 if a<=img[i,j]<=b:
            g[i,j]=255
        else:
            g[i,j]=0.
7. Mostramos la imagen original y la imagen de salida con la función  aplicada.
8. Guardamos Imagen con la función aplicada.
9. Cerramos ventanas.
10. Fin

Código de la función Nivel de gris (Caso 2)

import numpy as np
import numpy 
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\T.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)

a=100
b=170

for in range (reg):
    for j in range (col):

        if a<=img[i,j]<=b:
            g[i,j]=255
        else:
            g[i,j]=0

cv2.imshow ('Arbol',img)                              
cv2.imshow ('Negro',g)                          
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)

    cv2.destroyAllWindows()





 Foto 14. Ejemplo de una imagen original  y la aplicación de la función transformación lineal por partes dado un rango, Caso 2 Nivel de gris.

Recalco que por el tipo de imagen que estoy usando se observa como imagen binaria.


RANGO ESPECIFICO DE NIVEL DE GRIS (CASO 3) 

En este caso estamos usando la misma función  que el  anterior, ya que se quiere resaltar un rango en especifico, pero el resto de la imagen se mantendrá de la misma forma debido a que se esta usando la función de identidad, por lo que en esa parte de la imagen no sufrirá cambio más que en lo que queremos resaltar.

La función del tercer caso esta dada  por 


S={L-1, si a<r<=b
                  r, cualquier otro caso  

 Donde  L-1 es 256-1.
b son valores asignados por nosotros ya que es donde determinamos el rango.
 es la función de entrada  en este caso f(x,y).



           Foto 15. Gráfica de la función transformación lineal por partes, Caso 3  Nivel de gris


Algoritmo o pseudocodigo para la función transformación lineal por partes, Caso 3 Nivel de gris.

1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
5. Asignamos los valores a a y b  con valores que nosotros queramos siempre y cuando no sobrepase los 255 ya que es donde se especificara el rango para aplicar el nivel de gris.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función de nivel de gris, en este caso
  if a<img[i,j]<=b:
            g[i,j]=255
        else:
            g[i,j]=img[i,j].
7. Mostramos la imagen original y la imagen de salida con la función  aplicada.
8. Guardamos Imagen con la función aplicada.
9. Cerramos ventanas.
10. Fin


Código de la función Nivel de gris (Caso 3)

import numpy as np
import numpy 
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\T.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)

a=100
b=170

for in range (reg):
    for j in range (col):

        if a<img[i,j]<=b:
            g[i,j]=255
        else:
            g[i,j]=img[i,j]

cv2.imshow ('Arbol',img)                              
cv2.imshow ('Negro',g)                          
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)

    cv2.destroyAllWindows()





 Foto 16. Ejemplo de una imagen original  y la aplicación de la función transformación lineal por partes dado un rango, Caso 3 Nivel de gris.



THRESHOLD  (CASO 4) 

En este caso utilizamos un limite para asignarlo llamado umbral, dependiendo del valor que uses resaltarás lo que desees de la imagen y esto se encuentra utilizando prueba y error, en pocas palabras debes jugar con el umbral para resaltar lo que desees de la imagen.

La función del cuarto caso esta dada  por 


S={0, si T<=r
      L-1, si T>r  

 Donde  L-1 es 256-1.
T es el umbral a encontrar probando con valores asignados.
 es la función de entrada  en este caso f(x,y).



             Foto 17. Gráfica de la función transformación lineal por partes, Caso 4  Threshold


Algoritmo o pseudocodigo para la función transformación lineal por partes, Caso 4 Threshold (Umbral).

1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
5. Asignamos el valor del umbral en este caso T.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función Threshold, en este caso
    if T<=img[i,j]:
            g[i,j]=255
        if T>img[i,j]:
            g[i,j]=0.
7. Mostramos la imagen original y la imagen de salida con la función  aplicada.
8. Guardamos Imagen con la función aplicada.
9. Cerramos ventanas.
10. Fin

Código de la función Threshold  (Caso 4)

import numpy as np
import numpy 
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\T.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)

T=90

for in range (reg):
    for j in range (col):

         if T<=img[i,j]:
            g[i,j]=255
        if T>img[i,j]: 
            g[i,j]=0

cv2.imshow ('Arbol',img)                              
cv2.imshow ('Negro',g)                          
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)

    cv2.destroyAllWindows()







 Foto 18. Ejemplo de una imagen original  y la aplicación de la función Threshold (Caso 4).





HISTOGRAMA DE UNA IMAGEN 

El histograma de una imagen digital con niveles de gris en el rango [0, L – 1] es una función discreta h (rk) = nk donde rk es el nivel de gris k-ésimo y nk es el número de pixeles en la imagen con nivel de gris rk. 
Para normalizar el histograma se divide cada uno de sus valores entre el número total de pixeles en la imagen, n. Así, el histograma normalizado se obtiene de p (rk) = nk / n, para k = 0, 1, ...[1]


La función esta dada  por :

                                                    h(rk)=nk


Donde h(rk) es el nivel de gris
nk es el numero de veces que aparece en nivel de gris dentro de la imagen 


Algoritmo o pseudocodigo para el histograma de una imagen.

1. Debemos de importar la librería matplotlib ya que es la que usaremos para la creación del histograma.
2. Leemos la imagen en escala de grises.
3. Se obtiene el tamaño de la imagen.
4. Creamos la matriz con el tamaño de la imagen.
5. Creamos el arreglo con un tamaño de 256 ya que es el nivel máximo en la matriz y con tipo de dato entero.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función del histograma tomando en cuenta el arreglo declarado, en este caso
    V = img[i, j]
         Histograma[V] = Histograma[V] + 1.
7.Utilizamos una variable temporal para la lectura de la imagen y utilizamos la variable de la librería matplotlib para llevarlo acabo.
8. Asignamos los parámetros para el histograma como tamaño colores etc.
9. Mostramos la imagen original y su histograma (Gráfica) este utilizando la libreria matplotlib .
10. Guardamos el histograma.
11. Cerramos ventanas.
12. Fin

Código de la función Histograma de una imagen 

import numpy as np
import numpy 
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\T.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)

Histograma = np.zeros([256],int)

for in range (reg):
    for j in range (col):

       V = img[i, j]
           Histograma[V] = Histograma[V] + 1

fig =plt.figure()
ax=fig.add_subplot(111)
xx=range(len(Histograma))
ax.bar(xx, Histograma, width=5, color=(1,0,0))
ax.set_ylabel('Veces')

plt.show()
cv2.imshow ('Arbol',img)                                          
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    plt.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)

    cv2.destroyAllWindows()








                                 Foto 19. Ejemplo de una imagen original  y su histograma.


Referencias

[1]http://read.pudn.com/downloads159/ebook/711796/Procesamiento_Digital_de_Imagenes.pdf

  Consulta 10 de octubre del 2016
  Consulta 11 de octubre del 2016
  Consulta 15 de octubre del 2016