|
@@ -1,222 +1,2 @@
|
1
|
|
-[English](#markdown-header-recursion-image-scrambler) | [Español](#markdown-header-recursion-revolvedor-de-imagenes)
|
2
|
|
-
|
3
|
|
-#Recursión - Revolvedor de imágenes
|
4
|
|
-
|
5
|
|
-![main1-small.png](images/main1-small.png)
|
6
|
|
-![main2-small.png](images/main2-small.png)
|
7
|
|
-![main3-small.png](images/main3-small.png)
|
8
|
|
-
|
9
|
|
-
|
10
|
|
-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.
|
11
|
|
-
|
12
|
|
-## Objetivos:
|
13
|
|
-
|
14
|
|
-1. Definir e implementar funciones recursivas.
|
15
|
|
-2. Practicar el procesamiento de imágenes.
|
16
|
|
-3. Practicar el uso de estructuras de control y repetición.
|
17
|
|
-
|
18
|
|
-
|
19
|
|
-## Pre-Lab:
|
20
|
|
-
|
21
|
|
-Antes de llegar al laboratorio debes haber:
|
22
|
|
-
|
23
|
|
-1. Repasado los conceptos relacionados a funciones recursivas.
|
24
|
|
-
|
25
|
|
-2. Haber estudiado los conceptos e instrucciones para la sesión de laboratorio.
|
26
|
|
-
|
27
|
|
-3. Haber tomado el quiz Pre-Lab que se encuentra en Moodle.
|
28
|
|
-
|
29
|
|
-
|
30
|
|
----
|
31
|
|
-
|
32
|
|
----
|
33
|
|
-
|
34
|
|
-
|
35
|
|
-## Revolver imágenes digitalmente
|
36
|
|
-
|
37
|
|
-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]
|
38
|
|
-
|
39
|
|
----
|
40
|
|
-
|
41
|
|
-![figure1.png](images/figure1.png)
|
42
|
|
-
|
43
|
|
-**Figura 1.** La imagen de la izquierda fue cifrada utilizando la técnica de revolver la imagen y se obtuvo la imagen de la derecha. Tomada de [2].
|
44
|
|
-
|
45
|
|
----
|
46
|
|
-
|
47
|
|
-Existen muchos métodos que han sido propuestos para revolver imágenes. En esta experiencia de laboratorio utilizarás un método muy simple que tiene una implementación natural usando funciones recursivas.
|
48
|
|
-
|
49
|
|
-### ¡Revuélvela!
|
50
|
|
-
|
51
|
|
-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.
|
52
|
|
-
|
53
|
|
----
|
54
|
|
-
|
55
|
|
-![figure2.png](images/figure2.png)
|
56
|
|
-
|
57
|
|
-**Figura 2.** Revoltillo de nivel 1: (a) es la imagen original dividida en cuadrantes, (b) es la imagen luego de revolverla el primer nivel intercambiando cuadrantes diagonales.
|
58
|
|
-
|
59
|
|
----
|
60
|
|
-
|
61
|
|
-El revoltillo del siguiente nivel, *nivel 2*, primero intercambia las mitades izquierda y derecha de la imagen. Luego le aplica un revoltillo de *nivel 1* a cada cuadrante. Observa que el revoltillo de nivel 1 es aplicado a cada uno de los cuatro cuadrantes de la imagen original.
|
62
|
|
-
|
63
|
|
----
|
64
|
|
-
|
65
|
|
-![figure3.png](images/figure3.png)
|
66
|
|
-
|
67
|
|
-**Figura 3.** Revoltillo de nivel 2: (a) es la imagen original, (b) es la imagen luego de intercambiar las mitades izquierda y derecha, (c) es la imagen luego de aplicar revoltillo de nivel 1 a cada cuadrante.
|
68
|
|
-
|
69
|
|
----
|
70
|
|
-
|
71
|
|
-**Pregunta:** ¿Cuál de las figuras (a), (b), (c), (d) representa el resultado de hacerle un revoltillo de *nivel 2* al siguiente dibujo de un pingüino?
|
72
|
|
-
|
73
|
|
----
|
74
|
|
-
|
75
|
|
-![figure4.png](images/figure4.png)
|
76
|
|
-
|
77
|
|
-
|
78
|
|
-![figure5.png](images/figure5.png)
|
79
|
|
-
|
80
|
|
----
|
81
|
|
-
|
82
|
|
-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.
|
83
|
|
-
|
84
|
|
-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?
|
85
|
|
-
|
86
|
|
-El algoritmo para revolver que se acaba de describir es su propio inverso. Esto es, si le aplicas el mismo algoritmo a la imagen revuelta debes obtener la imagen original.
|
87
|
|
-
|
88
|
|
-
|
89
|
|
-
|
90
|
|
-Las siguientes figuras ilustran los intercambios que hacen los revoltillos de nivel 1, 2 y 3.
|
91
|
|
-
|
92
|
|
----
|
93
|
|
-
|
94
|
|
-![figure6.png](images/figure6.png)
|
95
|
|
-
|
96
|
|
-**Figura 6.** Revoltillo de nivel 1: se intercambian los cuadrantes diagonales.
|
97
|
|
-
|
98
|
|
----
|
99
|
|
-
|
100
|
|
-
|
101
|
|
-![figure7.png](images/figure7.png)
|
102
|
|
-
|
103
|
|
-**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.
|
104
|
|
-
|
105
|
|
-
|
106
|
|
----
|
107
|
|
-
|
108
|
|
-![figure8.png](images/figure8.png)
|
109
|
|
-
|
110
|
|
-**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.
|
111
|
|
-
|
112
|
|
-
|
113
|
|
----
|
114
|
|
-
|
115
|
|
----
|
116
|
|
-
|
117
|
|
-
|
118
|
|
-## Funciones adicionales provistas en el proyecto
|
119
|
|
-
|
120
|
|
-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:
|
121
|
|
-
|
122
|
|
-```
|
123
|
|
-void ImageScrambler::cropSwap(QImage &img, int x0, int y0, int x1, int y1, int width, int height );
|
124
|
|
-```
|
125
|
|
-
|
126
|
|
-Sus parámetros son:
|
127
|
|
-`img`: referencia a la imagen que se desea modificar (un objeto de clase `QImage`)
|
128
|
|
-`x0`, `y0`,`x0`, `y0`: coordenadas de las esquinas superior izquierda del los rectángulos.
|
129
|
|
-`width`, `height`: ancho y altura (en píxeles) de los rectángulos.
|
130
|
|
-
|
131
|
|
-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í:
|
132
|
|
-
|
133
|
|
-```
|
134
|
|
-cropSwap(P, 0, 0, 0, 75, 100, 75 );
|
135
|
|
-```
|
136
|
|
-
|
137
|
|
-
|
138
|
|
-----
|
139
|
|
-
|
140
|
|
-----
|
141
|
|
-
|
142
|
|
-
|
143
|
|
-
|
144
|
|
-## Sesión de laboratorio:
|
145
|
|
-
|
146
|
|
-
|
147
|
|
-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.
|
148
|
|
-
|
149
|
|
-
|
150
|
|
-
|
151
|
|
-
|
152
|
|
-### Ejercicio 1: Pseudocódigo de la función para revolver
|
153
|
|
-
|
154
|
|
-Escribe el pseudocódigo para expresar el algoritmo de revolver descrito arriba como una función recursiva.
|
155
|
|
-
|
156
|
|
-
|
157
|
|
-
|
158
|
|
-### Ejercicio 2: Función recursiva para revolver la imagen
|
159
|
|
-
|
160
|
|
-#### Instrucciones
|
161
|
|
-
|
162
|
|
-1. Carga a QtCreator el proyecto `ImageScrambler` haciendo doble "click" en el archivo `ImageScrambler.pro` en el directorio `Documents/eip/Recursion-ImageScrambler` de tu computadora. También puedes ir a `http://bitbucket.org/eip-uprrp/recursion-imagescrambler` para descargar la carpeta `Recursion-ImageScrambler` a tu computadora.
|
163
|
|
-
|
164
|
|
-2. El código que te proveemos crea la interfaz de la Figura 9.
|
165
|
|
-
|
166
|
|
- ---
|
167
|
|
-
|
168
|
|
- ![figure9.png](images/figure9.png)
|
169
|
|
-
|
170
|
|
- **Figura 9.** Interfaz del proyecto `Image Scrambler`.
|
171
|
|
-
|
172
|
|
- ---
|
173
|
|
-
|
174
|
|
- El botón que dice `Scramble Image` se programó para que invoque una función llamada `ScrambleFilter`.
|
175
|
|
-
|
176
|
|
-3. Completa la función `ScrambleFilter` contenida en el archivo `Filter.cpp` de modo que implemente el algoritmo recursivo de revolver imágenes. La función tiene el siguiente formato:
|
177
|
|
-
|
178
|
|
- ```cpp
|
179
|
|
-QImage ImageScrambler::ScrambleFilter(QImage image, int N, int sx, int sy, int width, int height);
|
180
|
|
-```
|
181
|
|
-
|
182
|
|
-4. Baja la imagen contenida en http://i.imgur.com/ZiJ61Gk.png para que valides la función que implementaste.
|
183
|
|
-
|
184
|
|
----
|
185
|
|
-
|
186
|
|
----
|
187
|
|
-
|
188
|
|
-
|
189
|
|
-## Entregas
|
190
|
|
-
|
191
|
|
-1. Utiliza "Entrega 1" en Moodle para entregar el archivo con el pseudocódigo de la función para revolver.
|
192
|
|
-
|
193
|
|
-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.
|
194
|
|
-
|
195
|
|
----
|
196
|
|
-
|
197
|
|
----
|
198
|
|
-
|
199
|
|
-##Referencias
|
200
|
|
-
|
201
|
|
-[1] F. Maleki et al., ‘‘An Image Encryption System by
|
202
|
|
-Cellular Automata with Memory,’’ Proc. 3rd Int’l
|
203
|
|
-Conf. Availability, Reliability, and Security, IEEE CS
|
204
|
|
-Press, 2008, pp. 12661271.
|
205
|
|
-
|
206
|
|
-[2] Dalhoum, Abdel Latif Abu, et al. "Digital Image Scrambling Using 2 D Cellular Automata." IEEE MultiMedia 19.4 (2012): 28-36.
|
207
|
|
-
|
208
|
|
-[3] http://www.instructables.com/id/Python-Programming-recursion/
|
209
|
|
-
|
210
|
|
----
|
211
|
|
-
|
212
|
|
----
|
213
|
|
-
|
214
|
|
----
|
215
|
|
-
|
216
|
|
-[English](#markdown-header-recursion-image-scrambler) | [Español](#markdown-header-recursion-revolvedor-de-imagenes)
|
217
|
|
-
|
218
|
|
-#Recursion - Image Scrambler
|
219
|
|
-
|
220
|
|
-![main1.png](images/main1-small.png)
|
221
|
|
-![main2.png](images/main2-small.png)
|
222
|
|
-![main3.png](images/main3-small.png)
|
|
1
|
+## [\[English\]](README-en.md) - for README in English
|
|
2
|
+## [\[Spanish\]](README-es.md) - for README in Spanish
|