root преди 8 години
родител
ревизия
b7ed415857
променени са 3 файла, в които са добавени 222 реда и са изтрити 222 реда
  1. 6
    0
      README-en.md
  2. 214
    0
      README-es.md
  3. 2
    222
      README.md

+ 6
- 0
README-en.md Целия файл

@@ -0,0 +1,6 @@
1
+
2
+#Recursion - Image Scrambler
3
+
4
+![main1.png](images/main1-small.png)
5
+![main2.png](images/main2-small.png)
6
+![main3.png](images/main3-small.png)

+ 214
- 0
README-es.md Целия файл

@@ -0,0 +1,214 @@
1
+
2
+#Recursión - Revolvedor de imágenes
3
+
4
+![main1-small.png](images/main1-small.png)
5
+![main2-small.png](images/main2-small.png)
6
+![main3-small.png](images/main3-small.png)
7
+
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.
10
+
11
+## Objetivos:
12
+
13
+1. Definir e implementar funciones recursivas.
14
+2. Practicar el procesamiento de imágenes.
15
+3. Practicar el uso de estructuras de control y repetición.
16
+
17
+
18
+## Pre-Lab:
19
+
20
+Antes de llegar al laboratorio debes haber:
21
+
22
+1. Repasado los conceptos relacionados a funciones recursivas.
23
+
24
+2. Haber estudiado los conceptos e instrucciones para la sesión de laboratorio.
25
+
26
+3. Haber tomado el quiz Pre-Lab que se encuentra en Moodle.
27
+
28
+
29
+---
30
+
31
+---
32
+
33
+
34
+## Revolver imágenes digitalmente
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]
37
+
38
+---
39
+
40
+![figure1.png](images/figure1.png)
41
+
42
+**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].
43
+
44
+---
45
+
46
+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.
47
+
48
+### ¡Revuélvela!
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.
51
+
52
+---
53
+
54
+![figure2.png](images/figure2.png)
55
+
56
+**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.
57
+
58
+---
59
+
60
+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.
61
+
62
+---
63
+
64
+![figure3.png](images/figure3.png)
65
+
66
+**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.
67
+
68
+---
69
+
70
+**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?
71
+
72
+---
73
+
74
+![figure4.png](images/figure4.png)
75
+
76
+
77
+![figure5.png](images/figure5.png)
78
+
79
+---
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.
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?
84
+
85
+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.
86
+
87
+
88
+
89
+Las siguientes figuras ilustran los intercambios que hacen los revoltillos de nivel 1, 2 y 3.
90
+
91
+---
92
+
93
+![figure6.png](images/figure6.png)
94
+
95
+**Figura 6.** Revoltillo de nivel 1: se intercambian los cuadrantes diagonales.
96
+
97
+---
98
+
99
+
100
+![figure7.png](images/figure7.png)
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.
103
+
104
+
105
+---
106
+
107
+![figure8.png](images/figure8.png)
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.
110
+
111
+
112
+---
113
+
114
+---
115
+
116
+
117
+## Funciones adicionales provistas en el proyecto
118
+
119
+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:
120
+
121
+```
122
+void ImageScrambler::cropSwap(QImage &img, int x0, int y0, int x1, int y1, int width, int height );
123
+```
124
+
125
+Sus parámetros son:
126
+`img`: referencia a la imagen que se desea modificar (un objeto de clase `QImage`)
127
+`x0`, `y0`,`x0`, `y0`: coordenadas de las esquinas superior izquierda del los rectángulos.
128
+`width`, `height`: ancho y altura (en píxeles) de los rectángulos.
129
+
130
+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í:
131
+
132
+```
133
+cropSwap(P, 0, 0, 0, 75, 100, 75 );  
134
+```
135
+
136
+
137
+----
138
+
139
+----
140
+
141
+
142
+
143
+## Sesión de laboratorio:
144
+
145
+
146
+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.
147
+
148
+
149
+
150
+
151
+### Ejercicio 1: Pseudocódigo de la función para revolver
152
+
153
+Escribe el pseudocódigo para expresar el algoritmo de revolver descrito arriba como una función recursiva.
154
+
155
+
156
+
157
+### Ejercicio 2: Función recursiva para revolver la imagen
158
+
159
+#### Instrucciones
160
+
161
+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.
162
+
163
+2. El código que te proveemos crea la interfaz de la Figura 9.
164
+
165
+    ---
166
+
167
+    ![figure9.png](images/figure9.png)
168
+
169
+    **Figura 9.** Interfaz del proyecto `Image Scrambler`.
170
+
171
+    ---
172
+
173
+    El botón que dice `Scramble Image` se programó para que invoque una función llamada `ScrambleFilter`.
174
+
175
+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:
176
+
177
+ ```cpp
178
+QImage ImageScrambler::ScrambleFilter(QImage image, int N, int sx, int sy, int width, int height);
179
+```
180
+
181
+4. Baja la imagen contenida en http://i.imgur.com/ZiJ61Gk.png para que valides la función que implementaste.
182
+
183
+---
184
+
185
+---
186
+
187
+
188
+## Entregas
189
+
190
+1. Utiliza "Entrega 1" en Moodle para entregar el archivo con el pseudocódigo de la función para revolver.
191
+
192
+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.
193
+
194
+---
195
+
196
+---
197
+
198
+##Referencias
199
+
200
+[1]  F. Maleki et al., ‘‘An Image Encryption System by
201
+Cellular Automata with Memory,’’ Proc. 3rd Int’l
202
+Conf. Availability, Reliability, and Security, IEEE CS
203
+Press, 2008, pp. 12661271.
204
+
205
+[2] Dalhoum, Abdel Latif Abu, et al. "Digital Image Scrambling Using 2 D Cellular Automata." IEEE MultiMedia 19.4 (2012): 28-36.
206
+
207
+[3] http://www.instructables.com/id/Python-Programming-recursion/
208
+
209
+---
210
+
211
+---
212
+
213
+---
214
+

+ 2
- 222
README.md Целия файл

@@ -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