|
|
|
|
1
|
-#Recursión - Revolvedor de imágenes
|
|
|
|
|
1
|
+# Recursión - Revolvedor de imágenes
|
2
|
|
2
|
|
3
|
![main1.png](images/main1-small.png)
|
3
|
![main1.png](images/main1-small.png)
|
4
|
![main2.png](images/main2-small.png)
|
4
|
![main2.png](images/main2-small.png)
|
5
|
![main3.png](images/main3-small.png)
|
5
|
![main3.png](images/main3-small.png)
|
6
|
|
6
|
|
7
|
-[Verano 2016 - Rafa - Ive]
|
|
|
|
|
7
|
+[Verano 2016 - Coralys]
|
8
|
|
8
|
|
9
|
-La recursión es una técnica muy utilizada en programación. Con esta técnica se resuelven problemas resolviendo un problema similar pero para casos más pequeños. Podemos construir conjuntos de objetos o procesos utilizando *reglas recursivas* y *valores iniciales*. Las *funciones recursivas* son funciones que se auto-invocan, utilizando cada vez conjuntos o elementos más pequeños, hasta llegar a un punto en donde se utiliza la condición inicial en lugar de auto-invocarse. En esta experiencia de laboratorio practicarás la definición e implementación de funciones recursivas para revolver una imagen y hacerla incomprensible.
|
|
|
|
|
9
|
+La recursión es una técnica muy utilizada en programación. Con esta técnica se resuelven problemas resolviendo un problema similar, pero para casos más pequeños. Podemos construir conjuntos de objetos o procesos utilizando *reglas recursivas* y *valores iniciales*. Las *funciones recursivas* son funciones que se auto-invocan, utilizando cada vez conjuntos o elementos más pequeños, hasta llegar a un punto en donde se utiliza la condición inicial en lugar de auto-invocarse. En esta experiencia de laboratorio, practicarás la definición e implementación de funciones recursivas para revolver una imagen y hacerla incomprensible.
|
10
|
|
10
|
|
11
|
-##Objetivos:
|
|
|
|
|
11
|
+## Objetivos:
|
12
|
|
12
|
|
13
|
1. Definir e implementar funciones recursivas.
|
13
|
1. Definir e implementar funciones recursivas.
|
14
|
2. Practicar el procesamiento de imágenes.
|
14
|
2. Practicar el procesamiento de imágenes.
|
15
|
3. Practicar el uso de estructuras de control y repetición.
|
15
|
3. Practicar el uso de estructuras de control y repetición.
|
16
|
|
16
|
|
17
|
|
17
|
|
18
|
-##Pre-Lab:
|
|
|
|
|
18
|
+## Pre-Lab:
|
19
|
|
19
|
|
20
|
Antes de llegar al laboratorio debes haber:
|
20
|
Antes de llegar al laboratorio debes haber:
|
21
|
|
21
|
|
|
|
|
|
23
|
|
23
|
|
24
|
2. Haber estudiado los conceptos e instrucciones para la sesión de laboratorio.
|
24
|
2. Haber estudiado los conceptos e instrucciones para la sesión de laboratorio.
|
25
|
|
25
|
|
26
|
-3. Haber tomado el quiz Pre-Lab que se encuentra en Moodle.
|
|
|
|
|
26
|
+3. Haber tomado el quiz Pre-Lab disponible en Moodle.
|
27
|
|
27
|
|
28
|
---
|
28
|
---
|
29
|
|
29
|
|
|
|
|
|
31
|
|
31
|
|
32
|
|
32
|
|
33
|
|
33
|
|
34
|
-##Revolver imágenes digitalmente
|
|
|
|
|
34
|
+## Revolver imágenes digitalmente
|
35
|
|
35
|
|
36
|
Al revolver las imágenes digitalmente reordenamos los píxeles de las imágenes para romper la relación entre píxeles adyacentes y así hacer que la imagen original sea incomprensible. Esta técnica se usa mucho para cifrar imágenes y esconder datos. [1]
|
36
|
Al revolver las imágenes digitalmente reordenamos los píxeles de las imágenes para romper la relación entre píxeles adyacentes y así hacer que la imagen original sea incomprensible. Esta técnica se usa mucho para cifrar imágenes y esconder datos. [1]
|
37
|
|
37
|
|
|
|
|
|
47
|
|
47
|
|
48
|
### ¡Revuélvela!
|
48
|
### ¡Revuélvela!
|
49
|
|
49
|
|
50
|
-El método que utilizarás para revolver las imágenes funciona intercambiando rectángulos de una imagen un cierto número de veces, según lo establezca el *nivel*. La Figura 2 ilustra un revoltillo de *nivel 1* de una imagen: se intercambian los cuadrantes diagonales. Observa también la Figura 6.
|
|
|
|
|
50
|
+El método que utilizarás para revolver las imágenes funciona intercambiando rectángulos de una imagen un cierto número de veces, según lo establezca el *nivel*. La Figura 2 ilustra un revoltillo de *nivel 1* de una imagen: se intercambian los cuadrantes diagonales. Observa también la Figura 6.
|
51
|
|
51
|
|
52
|
---
|
52
|
---
|
53
|
|
53
|
|
|
|
|
|
78
|
|
78
|
|
79
|
---
|
79
|
---
|
80
|
|
80
|
|
81
|
-Si continuamos el patrón, un revoltillo de *nivel 3* comienza intercambiando los cuadrantes diagonales. Luego le aplica un revoltillo de *nivel 2* a cada cuadrante: intercambia las mitades izquierda y derecha y aplica el revoltillo de *nivel 1* a cada nuevo cuadrante. La Figura 8 muestra el proceso de hacer un revoltillo de nivel 3.
|
|
|
|
|
81
|
+Si continuamos el patrón, un revoltillo de *nivel 3* comienza intercambiando los cuadrantes diagonales. Luego le aplica un revoltillo de *nivel 2* a cada cuadrante: intercambia las mitades izquierda y derecha, y aplica el revoltillo de *nivel 1* a cada nuevo cuadrante. La Figura 8 muestra el proceso de hacer un revoltillo de nivel 3.
|
82
|
|
82
|
|
83
|
Para revolver una imagen hacemos este proceso para un cierto *nivel N*. ¿Cuál es el patrón? ¿Cómo comenzaría el revoltillo de *nivel 4*? ¿En cuántos cuadrantes habremos dividido la figura original al completar el revoltillo?
|
83
|
Para revolver una imagen hacemos este proceso para un cierto *nivel N*. ¿Cuál es el patrón? ¿Cómo comenzaría el revoltillo de *nivel 4*? ¿En cuántos cuadrantes habremos dividido la figura original al completar el revoltillo?
|
84
|
|
84
|
|
|
|
|
|
99
|
|
99
|
|
100
|
![figure7.png](images/figure7.png)
|
100
|
![figure7.png](images/figure7.png)
|
101
|
|
101
|
|
102
|
-**Figura 7.** Revoltillo de nivel 2: (a) se intercambian las mitades izquierda y derecha, (b) se aplica un revoltillo de nivel 1 a cada cuadrante.
|
|
|
|
|
102
|
+**Figura 7.** Revoltillo de nivel 2: (a) se intercambian las mitades izquierda y derecha, (b) se aplica un revoltillo de nivel 1 a cada cuadrante.
|
103
|
|
103
|
|
104
|
|
104
|
|
105
|
---
|
105
|
---
|
106
|
|
106
|
|
107
|
![figure8.png](images/figure8.png)
|
107
|
![figure8.png](images/figure8.png)
|
108
|
|
108
|
|
109
|
-**Figura 8.** Revoltillo de nivel 3: (a) se intercambian los cuadrantes diagonales para luego aplicar revoltillo de nivel 2 a cada cuadrante (b) se intercambian mitades izquierda y derecha en cada cuadrante, (c) se aplica un revoltillo de nivel 1 a cada nuevo cuadrante.
|
|
|
|
|
109
|
+**Figura 8.** Revoltillo de nivel 3: (a) se intercambian los cuadrantes diagonales para luego aplicar revoltillo de nivel 2 a cada cuadrante, (b) se intercambian mitades izquierda y derecha en cada cuadrante, (c) se aplica un revoltillo de nivel 1 a cada nuevo cuadrante.
|
110
|
|
110
|
|
111
|
|
111
|
|
112
|
|
112
|
|
|
|
|
|
127
|
---
|
127
|
---
|
128
|
|
128
|
|
129
|
|
129
|
|
130
|
-##Funciones adicionales provistas en el proyecto
|
|
|
|
|
130
|
+## Funciones adicionales provistas en el proyecto
|
131
|
|
131
|
|
132
|
El proyecto en el que trabajarás hoy contiene la función `cropSwap` que implementa la funcionalidad de intercambiar los píxeles contenidos en dos rectángulos congruentes dentro de una imagen. Su prototipo es:
|
132
|
El proyecto en el que trabajarás hoy contiene la función `cropSwap` que implementa la funcionalidad de intercambiar los píxeles contenidos en dos rectángulos congruentes dentro de una imagen. Su prototipo es:
|
133
|
|
133
|
|
|
|
|
|
135
|
|
135
|
|
136
|
Sus parámetros son:
|
136
|
Sus parámetros son:
|
137
|
* `img`: referencia a la imagen que se desea modificar (un objeto de clase `QImage`)
|
137
|
* `img`: referencia a la imagen que se desea modificar (un objeto de clase `QImage`)
|
138
|
-* `x0`, `y0`,`x0`, `y0`: coordenadas de las esquinas superior izquierda del los rectángulos.
|
|
|
|
|
138
|
+* `x0`, `y0`,`x1`, `y1`: coordenadas de las esquinas superior izquierda del los rectángulos.
|
139
|
* `width`, `height`: ancho y altura (en píxeles) de los rectángulos.
|
139
|
* `width`, `height`: ancho y altura (en píxeles) de los rectángulos.
|
140
|
|
140
|
|
141
|
Por ejemplo, si deseamos intercambiar los píxeles de la mitad superior e inferior de una imagen *P* de ancho 100 y alto 150, invocamos la función así:
|
141
|
Por ejemplo, si deseamos intercambiar los píxeles de la mitad superior e inferior de una imagen *P* de ancho 100 y alto 150, invocamos la función así:
|
|
|
|
|
149
|
|
149
|
|
150
|
|
150
|
|
151
|
|
151
|
|
152
|
-##Sesión de laboratorio:
|
|
|
|
|
152
|
+## Sesión de laboratorio:
|
153
|
|
153
|
|
154
|
|
154
|
|
155
|
El proyecto `ImageScrambler` contiene el esqueleto de una aplicación para revolver y "des-revolver" imágenes. En la experiencia de laboratorio de hoy trabajarás con el archivo `Filter.cpp` para completar la aplicación.
|
155
|
El proyecto `ImageScrambler` contiene el esqueleto de una aplicación para revolver y "des-revolver" imágenes. En la experiencia de laboratorio de hoy trabajarás con el archivo `Filter.cpp` para completar la aplicación.
|
|
|
|
|
157
|
|
157
|
|
158
|
|
158
|
|
159
|
|
159
|
|
160
|
-###Ejercicio 1: Pseudocódigo de la función para revolver
|
|
|
|
|
160
|
+### Ejercicio 1: Pseudocódigo de la función para revolver
|
161
|
|
161
|
|
162
|
Escribe el pseudocódigo para expresar el algoritmo de revolver descrito arriba como una función recursiva.
|
162
|
Escribe el pseudocódigo para expresar el algoritmo de revolver descrito arriba como una función recursiva.
|
163
|
|
163
|
|
164
|
|
164
|
|
165
|
|
165
|
|
166
|
-###Ejercicio 2: Función recursiva para revolver la imagen
|
|
|
|
|
166
|
+### Ejercicio 2: Función recursiva para revolver la imagen
|
167
|
|
167
|
|
168
|
-####Instrucciones
|
|
|
|
|
168
|
+**Instrucciones**
|
169
|
|
169
|
|
170
|
1. Carga a `QtCreator` el proyecto `ImageScrambler`. Hay dos maneras de hacer esto:
|
170
|
1. Carga a `QtCreator` el proyecto `ImageScrambler`. Hay dos maneras de hacer esto:
|
171
|
|
171
|
|
172
|
* Utilizando la máquina virtual: Haz doble “click” en el archivo `ImageScrambler.pro` que se encuentra en el directorio `/home/eip/labs/recursion-imagescrambler` de la máquina virtual.
|
172
|
* Utilizando la máquina virtual: Haz doble “click” en el archivo `ImageScrambler.pro` que se encuentra en el directorio `/home/eip/labs/recursion-imagescrambler` de la máquina virtual.
|
173
|
- * Descargando la carpeta del proyecto de `Bitbucket`: Utiliza un terminal y escribe el commando `git clone http:/bitbucket.org/eip-uprrp/recursion-imagescrambler` para descargar la carpeta `recursion-imagescrambler` de `Bitbucket`. En esa carpeta, haz doble “click” en el archivo `ImageScrambler.pro`.
|
|
|
|
|
173
|
+
|
|
|
174
|
+ * Descargando la carpeta del proyecto de `Bitbucket`: Utiliza el terminal de la máquina virtual y escribe el commando `git clone http:/bitbucket.org/eip-uprrp/recursion-imagescrambler` para descargar la carpeta `recursion-imagescrambler` de `Bitbucket`. En esa carpeta, haz doble “click” en el archivo `ImageScrambler.pro`.
|
174
|
|
175
|
|
175
|
2. El código que te proveemos crea la interfaz de la Figura 9.
|
176
|
2. El código que te proveemos crea la interfaz de la Figura 9.
|
176
|
|
177
|
|
|
|
|
|
198
|
|
199
|
|
199
|
1. Utiliza "Entrega 1" en Moodle para entregar el archivo con el pseudocódigo de la función para revolver.
|
200
|
1. Utiliza "Entrega 1" en Moodle para entregar el archivo con el pseudocódigo de la función para revolver.
|
200
|
|
201
|
|
201
|
-2. Utiliza "Entrega 2" en Moodle para entregar el archivo `Filter.cpp` que contiene las funciones que implementaste en esta experiencia de laboratorio. Recuerda utilizar buenas prácticas de programación, incluir el nombre de los programadores y documentar tu programa.
|
|
|
|
|
202
|
+2. Utiliza "Entrega 2" en Moodle para entregar el archivo `Filter.cpp` que contiene las funciones que implementaste en esta experiencia de laboratorio. Recuerda utilizar buenas prácticas de programación, al incluir el nombre de los programadores y documentar tu programa.
|
202
|
|
203
|
|
203
|
---
|
204
|
---
|
204
|
|
205
|
|