Zoom con splines (Métodos Numéricos)
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);