Práctica 3. TDA Imagen
Funciones
Referencia del Archivo zoom.cpp

Aplica un zoom 2x de una imagen PGM. Más...

#include <iostream>
#include <cstdlib>
#include "image.h"
Dependencia gráfica adjunta para zoom.cpp:

Funciones

int main (int argc, char *argv[])
 

Descripción detallada

Aplica un zoom 2x de una imagen PGM.

Merece la pena detallar el proceso de obtención de la imagen "zoomeada".

La idea reside en expandir la imagen al doble de su tamaño original y rellenar los bytes correspondientes con la media de aquellos que le rodean.

Así, por ejempolo, si tenemos en cierta fila dos bytes de valores 1 y 255 se colocará en esa misma fila y entre esos dos un byte de valor 128. Esto resulta natural, y funciona para todos los píxeles salvo para aquellos nuevos bytes de la matriz que no estén rodeados ni en su fila ni en so columna por bytes originales. Usaremos el método Image::Mean() para tratarlos.

En primer lugar, el método Image::Zoom2X() generará una imagen que tendrá el doble de filas y de columnas (-1) que la original. Tras esto, comenzamos a rellenar la matriz distinguiendo casos:

Iterando sobre la matriz ampliada:

Este cálculo obtiene lo que queremos tanto en el caso en el que el píxel esté "rodeado" en su fila o columna por originales como en el contrario, veamos cómo:

(Téngase en cuenta que el método Image::Mean() recibe una casilla (fila/columna) y dos desplazamientos, uno horizontal y otro vertical, devuelviendo el píxel medio de los contenidos en el rectángulo cuya esquina superior izquierda es la casilla dada y se extiende con los desplazamientos indicados).

Procediendo análogamente, tomaríamos la media del cuadrado en la matriz original cuya esquina superior izquierda está en ( (fil-1)/2 , (col-1)/2 ) y se extiende hacia abajo y hacia la derecha en 2 líneas. Así, la media para nuestro píxel insertado sería la de los cuatro píxeles que tocan sus esquinas, como buscábamos.

Parámetros
FichImagenOriginalFichero de la imagen original.
FichImagenDestinoFichero donde se va a guardar la imagen con el zoom aplicado.
filaFila de la esquina superior izquierda de la zona de recorte.
columnaColumna de la esquina superior izquierda de la zona de recorte.
LadoLongitud del lado del cuadrado a recortar.
Precondición
(fila, columna) debe ser una posición válida.
Lado > 0
La zona a aplicar el zoom debe estar entera incluida en la imagen original.

Ejemplo de uso:

./zoom ./imagen_original.pgm ./imagen_ampliada.pgm 85 145 60

Este ejemplo muestra cómo utilizar el ejecutable Zoom para ampliar x2 una imagen. Se amplía x2 la imagen desde la esquina (85,145) un cuadrado de lado 60 píxeles.

Imagen Original
Imagen Original
Imagen Ampliada
Imagen Ampliada
Autor
Arturo Olivares Martos
Daniel Hidalgo Chica