Está en la página 1de 28

19/7/2019

6-Procesamiento Morfologico- Guia (3)

LABORATORIO 06

PROCESAMIENTO MORFOLOGICO

Escuela de Ingenieria Mecatronica UNT - Curso Procesamiento de Imagenes Digitales

AGUILAR VALDIVIEZO ANDY HANSEscuela de Ingenieria Mecatronica UNT - Curso Procesamiento de Imagenes Digitales IX CICLO

IX CICLOEscuela de Ingenieria Mecatronica UNT - Curso Procesamiento de Imagenes Digitales AGUILAR VALDIVIEZO ANDY HANS

1. Objetivos:

El estudiante conoce las operaciones morfologicas basicasAGUILAR VALDIVIEZO ANDY HANS IX CICLO 1. Objetivos: El estudiante aplica distintas operaciones morfológicas

El estudiante aplica distintas operaciones morfológicas para obtener partes relevantes de una imagen.El estudiante conoce las operaciones morfologicas basicas 2. Instrucciones Repase el material teorico y el material

2. Instrucciones

Repase el material teorico y el material extra facilitado por el docente, luego implemente los siguientes enunciados en Python, solicite ayuda al docente cuando sea necesario. QUE LAS GRAFICAS SEAN LO SUFICIENTEMENTE GRANDES PARA QUE SE VISUALICEN ADECUADAMENTE

2.1. Aplique las operaciones morfologicas de: Dilatacion, erosion, apertura y cierre a la imagen broken. png

La imagen debe ser previamente convertida a escala de grises, y binarizada usando un umbral de 128erosion, apertura y cierre a la imagen broken. png Experimente con distintos elementos estructurantes

Experimente con distintos elementos estructurantesa escala de grises, y binarizada usando un umbral de 128 Transformaciones morfológicas Las transformaciones

Transformaciones morfológicas

Las transformaciones morfológicas son algunas operaciones simples basadas en la forma de la imagen, que normalmente se aplican a imágenes binarias. Necesita dos entradas, una es nuestra imagen original, la segunda se llama elemento estructurante o núcleo (kernel) que decide la naturaleza de la operación. Dos operadores morfológicos básicos son Erosión y Dilatación. Luego, sus formas variantes como Apertura, Cierre, Gradiente, etc, también entran en juego. A continuación se verán algunas de estas transformaciones, apoyándonos en la siguiente imagen binaria:

In [1]:

%matplotlib inline from skimage import data,color import numpy as np import matplotlib.pyplot as plt from skimage import io,morphology import skimage.morphology as mpl

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [2]:

#importación de la imagen a trabajar img=io.imread('broken.png') #conversión de la imagen de RGB a escala de grises

img2=color.rgb2gray(img)

#ploteo de la imagen

io.imshow(img2)

io.show() #binarización de la imagen

img3=img2>0.5

#ploteo de la imagen binarizada

io.imshow(img3)

io.show()

de la imagen binarizada io . imshow(img3) io . show() localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE
de la imagen binarizada io . imshow(img3) io . show() localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [3]:

#obtención del elemento estructural de un circulo de 5 pixeles

z1=mpl.disk(5)

#ploteo del elemento estructurante

plt.imshow(z1,cmap='gray')

plt.show()

plt . imshow(z1,cmap = 'gray' ) plt . show() Dilatación El proceso de dilatación es justo

Dilatación

El proceso de dilatación es justo lo opuesto a la erosión. Aquí, un elemento de píxel es ‘1’ si al menos un píxel de la imagen de los que caen dentro de la ventana del kernel es ‘1’. Por lo tanto, la dilatación aumenta el tamaño de los objetos de primer plano, es decir, la región blanca. Normalmente, en casos como la eliminación del ruido, la erosión es seguida de dilatación. La razón para esto es que aunque la erosión elimina los ruidos blancos también encoge los objetos. Por tanto, para recuperar el tamaño inicial, este se dilata. La transformación de dilatación también es útil para unir partes rotas de un objeto. A continuación un ejemplo de cómo la dilatación funciona:

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [4]:

#Aplicación de la operación morfológica de dilatación

dil=mpl.binary_dilation(img3,z1)

io.imshow(dil)

io.show()

. binary_dilation(img3,z1) io . imshow(dil) io . show() Apertura La apertura es simplemente otro nombre para

Apertura

La apertura es simplemente otro nombre para erosión seguida de dilatación. Como se explicó anteriormente, es útil para eliminar el ruido

In [5]:

#Aplicación de la operación morfológica de apertura

aper=mpl.opening(img3,z1)

io.imshow(aper)

io.show()

= mpl . opening(img3,z1) io . imshow(aper) io . show() localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE

19/7/2019

6-Procesamiento Morfologico- Guia (3)

Erosión

Similar a la convolución 2D, en el proceso de erosionado un kernel se desliza a través de la imagen. Un píxel de la imagen original (1 ó 0) sólo se considerará 1 si todos los píxeles que caen detro de la ventana del kernel son 1, de lo contrario se erosiona (se hace a cero). Por tanto, todos los píxeles cerca de los bordes de los objetos en la imagen serán descartados dependiendo del tamaño del kernel. Como consecuencia, el grosor o el tamaño de los objetos en primer plano disminuye o, en otras palabras, la región blanca disminuye en la imagen.

In [6]:

#Aplicación de la operación morfológica de erosión

ero=mpl.binary_erosion(img3,z1)

io.imshow(ero)

io.show()

. binary_erosion(img3,z1) io . imshow(ero) io . show() Cierre El Cierre es el opuesto de Apertura,

Cierre

El Cierre es el opuesto de Apertura, es decir, dilatación seguida de erosión. Es útil para cerrar pequeños agujeros dentro de los objetos de primer plano, o pequeños puntos negros en el objeto. Vea un ejemplo a continuación:

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [7]:

#Aplicación de la operación morfológica de clausura

claus=mpl.closing(img3,z1)

io.imshow(claus)

io.show()

= mpl . closing(img3,z1) io . imshow(claus) io . show() 2.2. En la imagen cuadros.png use

2.2. En la imagen cuadros.png use la transformacion de acierto y falla para marcar la esquina superior izquerda de cada cuadrilatero

Reporte el total de cuadrilateros en la imagenmarcar la esquina superior izquerda de cada cuadrilatero Conpruebe el funcionamiento del algoritmo usando la imagen

Conpruebe el funcionamiento del algoritmo usando la imagen cuadrosT.pngcuadrilatero Reporte el total de cuadrilateros en la imagen localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [8]:

#importación de la imagen a trabajar img=io.imread('cuadros.png')

img2=color.rgb2gray(img)

#binarización de la imagen

img3=img2>0.5

#ploteo de la imagen binarizada

io.imshow(img2)

io.show()

#negación de la imagen

img2c=1-img2

#ploteo de la imagen negada

io.imshow(img2c)

io.show()

de la imagen negada io . imshow(img2c) io . show() localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE
de la imagen negada io . imshow(img2c) io . show() localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [9]:

#ingreso de los elementos estructurantes

B1=np.array([[0,0,0],[0,1,1],[0,1,0]])

io.imshow(B1)

io.show()

B2=np.array([[1,1,1],[1,0,0],[1,0,0]])

io.imshow(B2)

io.show()

C:\Users\crist\Anaconda3\lib\site-packages\skimage\io\_plugins\matplotlib_

plugin.py:77: UserWarning: Low image data range; displaying image with str etched contrast. warn("Low image data range; displaying image with "

warn("Low image data range; displaying image with " localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE
warn("Low image data range; displaying image with " localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [10]:

#aplicación de la operación de acierto y falla

ero1=mpl.binary_erosion(img2,B1)

ero2=mpl.binary_erosion(img2c,B2)

img3=ero1*ero2

io.imshow(img3)

io.show()

img3 = ero1 * ero2 io . imshow(img3) io . show() 2.3. Implemente un algoritmo para

2.3. Implemente un algoritmo para encontrar los puntos finales de la figura lineas.png

para encontrar los puntos finales de la figura lineas.png Reutilize la funcion filtro_espacial elaborado en el

Reutilize la funcion filtro_espacial elaborado en el laboratorio 2

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [11]:

#función espacial_filter modificada

def espacial_filter(imagen,mascara):

M,N=imagen.shape m,n=mascara.shape

cm=np.uint16((m-1)/2)

cn=np.uint16((n-1)/2)

#crear una imagen de rellenada con 0

img_pad=np.zeros((M+m-1,N+n-1))

img_pad[cm:cm+M,cn:cn+N]=imagen #crear una imagen vacia para almacenar la salida

result=np.zeros((M+cm,N+cn))

for i in np.uint16(np.arange(cm,cm+M)):

for j in np.uint16(np.arange(cn,cn+N)):

img_aux=img_pad[i-cm:i+(cm)+1,j-cn:j+cn +1] evaluacion=img_aux*mascara s_evaluacion=np.sum(evaluacion) #se aplican las condiciones para encontrar los puntos finales, en este caso, como s e utilizará una máscara de 3x3 #se reconocerá el punto siempre y cuando la nueva matriz evaluación tenga su centro igual a 1 y la suma de sus elementos #sea igual a 2. if evaluacion[1,1]==1:

if s_evaluacion==2:

result[i,j]=1

output=result[cm:cm+M,cn:cn+N] return(output) #recortado de resul al mismo tamaño que la imagen de origen

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [12]:

#importación de la imagen img=io.imread('lineas.png')

img2=color.rgb2gray(img)

#binarización de la imagen

img3=img2>0.5

#ploteo de la imagen binarizada

io.imshow(img3)

io.show()

de la imagen binarizada io . imshow(img3) io . show() localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [13]:

#ingreso de la mascara con la que se trabajará

mask=np.array([[1,1,1],[1,1,1],[1,1,1]])

#aplicación de la función espacial_filter

img4=espacial_filter(img3,mask)

#ploteo de la imagen obtenida con los puntos finales de las lineas encontrados

plt.imshow(img4,cmap='gray')

plt.show()

plt . imshow(img4,cmap = 'gray' ) plt . show() 2.4. Adelgazamiento y esqueletizacion de una imagen

2.4. Adelgazamiento y esqueletizacion de una imagen binaria

2.4. Adelgazamiento y esqueletizacion de una imagen binaria Trabaje con la imagen huella.jpg, muestre una imagen

Trabaje con la imagen huella.jpg, muestre una imagen comparativa de sus resultados

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [14]:

#importación de la imagen a trabajar img=io.imread('huella.jpg')

img2=color.rgb2gray(img)

#binarización de la imagen

img3=img2>0.5

#negación de la imagen

img4=1-img3

#ploteo de la imagen resultante

io.imshow(img4)

io.show()

de la imagen resultante io . imshow(img4) io . show() In [15]: #aplicación de la operacion

In [15]:

#aplicación de la operacion de adelgazamiento

img5=mpl.thin(img4)

#ploteo de la imagen resultante

io.imshow(img5)

io.show()

de la imagen resultante io . imshow(img5) io . show() localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [16]:

#aplicación de la operación de esqueletización

img6=mpl.skeletonize(img4)

#ploteo de la imagen resultante

io.imshow(img6)

io.show()

de la imagen resultante io . imshow(img6) io . show() 2.5. Etiquete la imagen form.png y

2.5. Etiquete la imagen form.png y muestre aisladamente una de las formas

la imagen form.png y muestre aisladamente una de las formas Trabaje con la imagen huella.jpg, muestre

Trabaje con la imagen huella.jpg, muestre una imagen comparativa de sus resultados

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [25]:

#importación de la imagen a trabajar img=io.imread('form.png')

img2=color.rgb2gray(img)

#binarización de la imagen

img2=img2>0.5

#negación de la imagen

img2=1-img2

#ploteo de la imagen obtenida

io.imshow(img2)

io.show() #aplicación de la operación label

img3=mpl.label(img2)

#ploteo de la imagen obtenida

io.imshow(img3)

io.show()

#ploteo de la fila 580 de la imagen para reconocer el valor de los píxeles de la forma

a aislar

plt.plot(img3[580,:])

#obtención de la forma aislada

img4=img3==7

#ploteo de la imagen obtenida

io.imshow(img4)

io.show()

#ploteo de la fila 580 de la imagen para reconocer el valor de los píxeles de la forma

a aislar

plt.plot(img3[580,:])

19/7/2019

6-Procesamiento Morfologico- Guia (3)

19/7/2019 6-Procesamiento Morfologico- Guia (3) Out[25]: [<matplotlib.lines.Line2D at 0x208cf374b00>]
19/7/2019 6-Procesamiento Morfologico- Guia (3) Out[25]: [<matplotlib.lines.Line2D at 0x208cf374b00>]
19/7/2019 6-Procesamiento Morfologico- Guia (3) Out[25]: [<matplotlib.lines.Line2D at 0x208cf374b00>]

Out[25]:

[<matplotlib.lines.Line2D at 0x208cf374b00>]

19/7/2019

6-Procesamiento Morfologico- Guia (3)

19/7/2019 6-Procesamiento Morfologico- Guia (3) 2.6. Con la imagen mark.png realize la Reconstruccion de las 3

2.6. Con la imagen mark.png realize la Reconstruccion de las 3 formas correspondientes

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [18]:

#importación de la imagen a trabajar img=io.imread('form.png')

img2=color.rgb2gray(img)

#binarización de la imagen

img2=img2>0.5

#negación de la imagen

img2=1-img2

#ploteo de la imagen obtenida

io.imshow(img2)

io.show()

#importación de la imagen con la que se hará la reconstrucción

img1=io.imread('mark.png')

img21=color.rgb2gray(img1)

#binarización

img21=img21>0.5

#ploteo de la imagen obtenida

io.imshow(img21)

io.show()

#aplicación de la operación reconstrucción con las dos imagenes anteriormente importada

s

rec=mpl.reconstruction(img21,img2)

#ploteo de la imagen reconstruída io.imshow(rec) io.show()

19/7/2019

6-Procesamiento Morfologico- Guia (3)

19/7/2019 6-Procesamiento Morfologico- Guia (3) localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE IMAGENES
19/7/2019 6-Procesamiento Morfologico- Guia (3) localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE IMAGENES
19/7/2019 6-Procesamiento Morfologico- Guia (3) localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE IMAGENES

19/7/2019

6-Procesamiento Morfologico- Guia (3)

2.7. implemente el algoritmo llenado de huecos descrito en la clase teorica, luego apliquela a la imagen latas1.jpg

Binarize con un umbral de 40 y haga una apertura con un selem de radio 3en la clase teorica, luego apliquela a la imagen latas1.jpg g= -(reconstruccion(fm,~f )) fm ={1 -

g= -(reconstruccion(fm,~f ))un umbral de 40 y haga una apertura con un selem de radio 3 fm ={1

fm ={1 - f ; solo si el pixel pertenece al bordecon un selem de radio 3 g= -(reconstruccion(fm,~f )) localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [19]:

#importación de la imagen a trabajar

img=io.imread('latas1.jpg')

#transformación a escala de grises

img2=color.rgb2gray(img)

#binarización de la imagen con un umbral de 40

img2=img2>40/255

#ploteo de la imagen obtenida

io.imshow(img2)

io.show() #obtención del elemento estructurante de 3 píxeles

z1=mpl.disk(3)

#operación de apertura

ap1=mpl.binary_opening(img2,z1)

#ploteo de la imagen obtenida

io.imshow(ap1)

io.show() #negación de la imagen

ap1c=1-ap1

#obtención del elemento estructurante para la reconstrucción

A=ap1

A[0,:]=1-ap1[0,:]

A[200-1,:]=1-ap1[200-1,:]

A[:,0]=1-ap1[:,0]

A[:,299]=1-ap1[:,299]

A[1:198,1:298]=0

#ploteo del elemento estructurante io.imshow(A) io.show() #aplicación de la operación de reconstrucción

g=-mpl.reconstruction(A,ap1c)

#ploteo de la imagen obtenida io.imshow(g) io.show()

19/7/2019

6-Procesamiento Morfologico- Guia (3)

19/7/2019 6-Procesamiento Morfologico- Guia (3) localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE IMAGENES
19/7/2019 6-Procesamiento Morfologico- Guia (3) localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE IMAGENES
19/7/2019 6-Procesamiento Morfologico- Guia (3) localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE IMAGENES

19/7/2019

6-Procesamiento Morfologico- Guia (3)

19/7/2019 6-Procesamiento Morfologico- Guia (3) 2.8. De la imagen comp2.jpg intente obtener solo los integrados, y

2.8. De la imagen comp2.jpg intente obtener solo los integrados, y luego limpie aquellos que estan pegados al borde de la imagen

Binarize con un umbral de 80 y haga una apertura con un selem de radio 3limpie aquellos que estan pegados al borde de la imagen g= -(reconstruccion(fm,~f )) fm ={1 -

g= -(reconstruccion(fm,~f ))un umbral de 80 y haga una apertura con un selem de radio 3 fm ={1

fm ={1 - f ; solo si el pixel pertenece al bordecon un selem de radio 3 g= -(reconstruccion(fm,~f )) localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [26]:

#importación de la imagen

img=io.imread('comp2.jpg')

#transformación de escala de grises

img2=color.rgb2gray(img)

#binarización con umbral de 80

img2=img2>80/255

#negación de la imagen

img2=1-img2

#ploteo de la imagen obtenida

io.imshow(img2)

io.show()

#selem con radio 3

z1=mpl.disk(3)

#aplicación de la operación de apertura

ap1=mpl.binary_opening(img2,z1)

#ploteo de la imagen resultante

io.imshow(ap1)

io.show()

#aplicación de la operación label

img4=mpl.label(ap1)

#ploteo de la imagen obtenida

plt.imshow(img4,cmap='gray')

plt.show()

#obtención de los circuitos integrados, como se ve en la gráfica de intensidades, los c ircuitos integrados de interés #tienen la intensidad igual a 4 y 6, con esos datos se obtienen dos imagenes y luego se multiplica para obtener #la imagen resultante

img5=img4==6

img6=img4==4

img7=1-(1-img5)*(1-img6)

io.imshow(img7)

io.show()

#ploteo de la fila 580 de la imagen para reconocer el valor de los píxeles de la forma a aislar

plt.plot(img4[50,:])

19/7/2019

6-Procesamiento Morfologico- Guia (3)

19/7/2019 6-Procesamiento Morfologico- Guia (3) Out[26]: [<matplotlib.lines.Line2D at 0x208d09e1d30>]
19/7/2019 6-Procesamiento Morfologico- Guia (3) Out[26]: [<matplotlib.lines.Line2D at 0x208d09e1d30>]
19/7/2019 6-Procesamiento Morfologico- Guia (3) Out[26]: [<matplotlib.lines.Line2D at 0x208d09e1d30>]
19/7/2019 6-Procesamiento Morfologico- Guia (3) Out[26]: [<matplotlib.lines.Line2D at 0x208d09e1d30>]

Out[26]:

[<matplotlib.lines.Line2D at 0x208d09e1d30>]

19/7/2019

6-Procesamiento Morfologico- Guia (3)

19/7/2019 6-Procesamiento Morfologico- Guia (3) In [30]: #importación de la imagen a trabajar img = io

In [30]:

#importación de la imagen a trabajar img=io.imread('pistas.jpg')

img2=color.rgb2gray(img)

#binarización de la imagen

img3=img2>0.5

#ploteo de la imagen obtenida

io.imshow(img3)

io.show()

de la imagen obtenida io . imshow(img3) io . show() localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [31]:

#aplicación de la operación label

img4=mpl.label(img3)

#ploteo de la imagen obtenida

plt.imshow(img4,cmap='gray')

plt.show() #obtención de las dimensiones de la imagen

print(img4.shape)

de las dimensiones de la imagen print (img4 . shape) (279, 350) In [32]: #binarización de

(279, 350)

In [32]:

#binarización de la imagen con un umbral de 1

img5=img4>1

#ploteo de la imagen obtenida

plt.imshow(img5,cmap='gray')

plt.show()

plt . imshow(img5,cmap = 'gray' ) plt . show() localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE

19/7/2019

6-Procesamiento Morfologico- Guia (3)

In [36]:

#aplicación de la operación de adelgazamiento

img6=mpl.thin(img5,2)

#ploteo de la imagen obtenida

io.imshow(img6)

io.show()

de la imagen obtenida io . imshow(img6) io . show() localhost:8888/nbconvert/html/Desktop/PROCESAMIENTO DE