Zoom con splines (Métodos Numéricos)

De Cuba-Wiki
Saltar a: navegación, buscar
Back.png Volver a la página de la materia

Tipos de splines[editar]

Spline natural
Spline de frontera sujeta
Spline parabolico
Spline extrapolado
Asegura que 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[editar]

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[editar]

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[editar]

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);