Zoom con splines (Métodos Numéricos)

De Cuba-Wiki

Tipos de splines

Spline natural
s x0 = s xn = 0
Spline sujeto
s'(x_0) = A
s'(x_n) = B
Spline parabolico
Spline extrapolado
Asegura q el spline coincide con la funcion si era un polinomio de grado 3
Idem para el otro borde
Spline periodico
Se usa si la funcion original era periodica, si se esta interpolando un periodo

Agregar condiciones distintas, fuera de los bordes, puede dar un sistema compatible determinado pero se pierde tridiagonalidad.

Los splines tienen control global, es decir, un solo punto influye en todo el spline, no localmente. En caso de encontrar un salto, se deben usar dos splines por separado para evitar errores.

Jugando con Splines

Ejemplo 1: Función suave

x=0:0.5:2*pi;
y=sin(x);
y(5)=y(5)+0.2;
xx=0:0.1:2*pi;
plot(x,y);
yy=spline(x,y,xx);
plot(x,y,'.b', xx,yy,'r',xx,sin(xx),'g')

Ejemplo 2: Función partida que no es suave

x=1:20;
y=[zeros(1,10) ones(1,10)];
xx=1:0.1:20;
yy=spline(x,y,xx);
plot(x,y,'.',xx,yy)

Ejemplo 3: "Campana"

x=1:5;
y=[0 3.5 5 3.5 0];
xx=1:0.01:5;
yy=spline(x,y,xx);
plot(x,y,'.',xx,yy)

Para que sea sugeto, a matlab se le pasan fod puntos extra en el vector (que serán las derivadas parciales) y, o sea, pasamos [0 y 0]

Zoom

El zoom tradicional consiste en, por ejemplo, si se desea duplicar las dimensiones de la matriz, por cada pixel original insertar 4 iguales. Esto produce un efecto de pixelado.

Usando splines se interpola por filas y/o columnas, y se extienden los valores del dominio a la cantidad necesaria. Luego se hallan los valores nuevos a partir del spline generado.

Algoritmo que hace zoom en la imagen:

img=imread('bart.bmp');
img=sum(img, 3)/3;
[n,m]=size(img);
V=1:1/2:m;
ret=zeros(n, length(V));
for i=1:n
        fila=img(i,:);
        ret(i,:)=spline(1:m,fila,V);
end; 

[n,m]=size(ret)
V=1:1/2:n;
ret2=zeros(length(V),m);
for i=1:m
        col=ret(:,i);
        ret2(:,i)=(spline(1:n,col',V))';
end; 

colormap(gray(255));
image(img);
figure;
colormap(gray(255));
image(ret2);
lin = ret2(100,:);
linori = ret2(50,:);
figure;
plot(lin);
figure;
plot(linori);

Detectando bordes con matlab

Este algoritmo detecta bordes en una imagen con una heurística muy simple, si la variación entre dos pixeles consecutivos es mayor a un lambda.

close all;
img=imread('lena.jpg');
img=sum(img, 3)/3;
[n,m]=size(img);
ret=img;
for i=1:n
    val=0;
    i
    for j=1:m
            val2=img(i,j);
            if abs(val-val2)>20
                ret(i,j)=255;
                 
            else
                ret(i,j)=0;
            end;
           val=val2;
    end;
end;
colormap(gray(255));
image(ret);
for i=1:m
    val=0;
    i
    for j=1:n
            val2=img(j,i);
            if abs(val-val2)>50
                ret(j,i)=255;    
            end;
           val=val2;
    end;
end;
figure;
colormap(gray(255));
image(ret);