圖像處理中的插值

thiele插值算法

1點插值算法

function [C,c]=thiele(X,Y,Z)%X為插值點橫坐標,Y為插值點縱坐標,Z為待插值點橫坐標.輸出為逆商系數和待插點縱坐標. C=nichashang(X,Y); c=display(Z,C,X) end function c=nichashang(a,b)%計算逆插商的值 [x,y]=size(a); d=zeros(y,y); c=ones(1,y) for j=1:y if(j==1) for i=1:y d(i,1)=b(1,i); end else for i=j:y d(i,j)=(a(1,i)-a(1,j-1))/(d(i,j-1)-d(j-1,j-1)); end end end for k=1:y c(1,k)=d(k,k); end end function c=display(X,Y,Z)%x為待求點值,y為thiele多項式系數,z為原插值點值 [x,y]=size(Y); [x1,y1]=size(X); c=ones(1,y1); for i=1:y1 A=ones(y+1,1); A(1,1)=1;A(2,1)=Y(1,1); B=ones(y+1,1); B(1,1)=0;B(2,1)=1; for k=3:y+1 A(k,1)=A(k-1,1)*Y(1,k-1)+(X(1,i)-Z(k-2))*A(k-2,1); B(k,1)=B(k-1,1)*Y(1,k-1)+(X(1,i)-Z(k-2))*B(k-2,1); end c(1,i)=A(y+1,1)/B(y+1,1); end end
示例
插值函數為sin(x)的四個點:pi/6 pi/4 pi/3 pi/2
待求點為Z=pi/5 pi/5.5 pi/6.5
x =

0.5236    0.7854    1.0472    1.5708

y =

0.5000    0.7071    0.8660    1.0000

輸出結果為:
逆商: 0.5000 1.2641 1.5731 -0.8348
插值點:0.5881 0.5409 0.4643

牛頓插值:

function [H,Z]=newtoncz(x,y,z)%x,y為插值坐標矩陣,z為待插值點 x=x';y=y';z=z';%轉致 hangx=size(x,1);%獲取x的行數; H=ones(hangx,hangx);%生成行數等于x的矩陣,用來存取系數 for j=1:hangx%這個循環是算法核心,即那個倒三角的表 if(j==1) H(:,1)=y; else for i=j:hangx H(i,j)=(H(i,j-1)-H(i-1,j-1))/(x(i,1)-x(i-j+1,1)); end end end %輸出系數 fprintf('系數為:'); for i=1:hangx fprintf('%f',H(i,i)); end fprintf('\n'); %計算待插點的值; hangz=size(z,1); Z=ones(hangz,1); for k=1:hangx if(k==1) Z(:,1)=y(1,1); S=z-x(1,1); else Z=Z+H(k,k)*S; S=S.*(z-x(k,1)); end end end
用法和示例同上:
下次分析這兩種插值的特點和優勢。
基于一維牛頓插值的圖像放縮:
function A=tuxiangchazhi(Y,apha)%進行圖像的一維插值運算,基于thiele和netwon兩種算法。X為灰色圖像矩陣圖像,apha為縮放系數,暫時假設aoha為2; [x,y]=size(Y); X=im2double(Y); x1=x*apha;y1=y*apha; A=zeros(x1,y1);%生成插值后矩陣模板 for i=apha:apha:x1 for j=apha:apha:y1 A(i,j)=X(i/apha,j/apha); end end%將原圖像的值對應賦予新圖像的位置 a=floor(y1/6);a1=mod(y1,6); b=round(x1/6);b1=mod(x1,6); for i=apha:apha:x1%先對行進行變化,使用newton方法,采取每八個點為一段,若段內變化率大于30%,直接賦值相鄰兩點中值 k=0; for j=1:6:y1 k=k+1; if (k==a+1)%檢驗圖像的每段中是否為8個點,每推進一段,重合兩點 if(a1~=0) for l=j:j+a1-1 A(i,l)=A(i,j); end end elseif(k==1) if(bianhualv(A(i,apha),A(i,2*apha))&&bianhualv(A(i,2*apha),A(i,3*apha))&&bianhualv(A(i,3*apha),A(i,4*apha)))%如果變化率小于30%,進行插值 s=newtoncz([0.1 0.2 0.3 0.4],[A(i,apha),A(i,2*apha),A(i,3*apha),A(i,4*apha)],[0 0.15 0.25 0.35]); A(i,1)=s(1,1);A(i,3)=s(2,1);A(i,5)=s(3,1);A(i,7)=s(4,1); else A(i,1)=A(i,2);A(i,3)=(A(i,2)+A(i,4))/2;A(i,5)=(A(i,4)+A(i,6))/2;A(i,7)=(A(i,6)+A(i,8))/2; end elseif(k==a) break; else if(bianhualv(A(i,j),A(i,j+1))&&bianhualv(A(i,j+1),A(i,j+3))&&bianhualv(A(i,j+3),A(i,j+5))&&bianhualv(A(i,j+5),A(i,j+7)))%如果變化率小于30%,進行插值 s=newtoncz([0.15 0.2 0.3 0.4 0.5],[A(i,j),A(i,j+1),A(i,j+3),A(i,j+5),A(i,j+7)],[0.25 0.35 0.45]); A(i,j+2)=s(1,1);A(i,j+4)=s(2,1);A(i,j+6)=s(3,1); else A(i,j+2)=(A(i,j+1)+A(i,j+3))/2;A(i,j+4)=(A(i,j+3)+A(i,j+5))/2;A(i,j+6)=(A(i,j+5)+A(i,j+7))/2; end end end end for j=apha:apha:y1%對列進行變化,使用newton方法,采取每八個點為一段,若段內變化率大于30%,直接賦值相鄰兩點中值 k=0; for i=1:6:x1 k=k+1; if (k==b+1)%檢驗圖像的每段中是否為8個點,每推進一段,重合兩點 if(b1~=0) for l=j:j+b1-1 A(i,j)=A(i+l,j); end end elseif(k==1) if(bianhualv(A(apha,i),A(2*apha,i))&&bianhualv(A(2*apha,i),A(3*apha,i))&&bianhualv(A(3*apha,i),A(4*apha,i)))%如果變化率小于30%,進行插值 s=newtoncz([0.1 0.2 0.3 0.4],[A(apha,i),A(2*apha,i),A(3*apha,i),A(4*apha,i)],[0 0.15 0.25 0.35]); A(1,j)=s(1,1);A(3,j)=s(2,1);A(5,j)=s(3,1);A(7,j)=s(4,1); else A(1,j)=A(2,j);A(3,j)=(A(2,j)+A(4,j))/2;A(5,j)=(A(4,j)+A(6,j))/2;A(7,j)=(A(6,j)+A(8,j))/2; end elseif(k==a) break; else if(bianhualv(A(i,j),A(i+1,j))&&bianhualv(A(i+1,j),A(i+3,j))&&bianhualv(A(i+3,j),A(i+5,j))&&bianhualv(A(i+5,j),A(i+7,j)))%如果變化率小于30%,進行插值 s=newtoncz([0.15 0.2 0.3 0.4 0.5],[A(i,j),A(i+1,j),A(i+3,j),A(i+5,j),A(i+7,j)],[0.25,0.35,0.45]); A(i+2,j)=s(1,1);A(i+4,j)=s(2,1);A(i+6,j)=s(3,1); else A(i+2,j)=(A(i+1,j)+A(i+3,j))/2;A(j+4,i)=(A(i+3,j)+A(i+5,j))/2;A(i+6,j)=(A(i+5,j)+A(i+7,j))/2; end end end end A=im2uint8(A); end function d=bianhualv(a,b)%計算相鄰像素變化率 c=abs(a-b); if(c/a<=0.3) d=1; else d=0; end end
處理示例:

004.jpg
005.jpg

效果太差了,不知道為什么越到下面越模糊,大家看看這程序,找找問題。

Netwon-Thiele算法

function B2=netwon2(Z,T)%Z為插值點坐標,T為待插值點坐標橫縱坐標,P為T的插值結果 M=Z'; [n,m]=size(M);%取得插值矩陣的大小 %首先對x方向newton遞推 M1=zeros(n,m); y1=1:m; for i1=1:n L=M(i1,:); S=netwon(y1,L)%對每一行進行牛頓遞推 M1(i1,:)=S; end %然后對y方向進行thiele遞推 M2=zeros(n,m); x1=1:n; for j1=1:m L1=M1(:,j1); L1=L1'; S1=nichashang(x1,L1); M2(:,j1)=S1; end %利用M2表中的值來計算y待插值點值 [n1,m1]=size(T); A1=T(:,2); A1=A1';%獲得y的坐標 A2=zeros(m,n1); for j1=1:m L1=M2(:,j1); L1=L1'; L2=thieledis(A1,L1,x1); A2(j1,:)=L2; end %計算(x,y)待插值點; B1=T(:,1); B1=B1'; B2=zeros(n1,n1); for i1=n1 l1=A2(:,n1); l1=l1'; Z=netwondis(B1,y1,l1); B2(n1,:)=Z; end end function S=netwon(x,y) x=x';y=y';%轉致 hangx=size(x,1);%獲取x的行數; H=ones(hangx,hangx);%生成行數等于x的矩陣,用來存取系數 for j=1:hangx%這個循環是算法核心,即那個倒三角的表 if(j==1) H(:,1)=y; else for i=j:hangx H(i,j)=(H(i,j-1)-H(i-1,j-1))/(x(i,1)-x(i-j+1,1)); end end end S=zeros(1,hangx); for i=1:hangx S(1,i)=H(i,i); end end function c=nichashang(a,b)%計算逆插商的值 [x,y]=size(a); d=zeros(y,y); c=ones(1,y); for j=1:y if(j==1) for i=1:y d(i,1)=b(1,i); end else for i=j:y d(i,j)=(a(1,i)-a(1,j-1))/(d(i,j-1)-d(j-1,j-1)); end end end for k=1:y c(1,k)=d(k,k); end c=c'; end function c=thieledis(X,Y,Z)%x為待求點值,y為thiele多項式系數,z為原插值點值 [x,y]=size(Y); [x1,y1]=size(X); c=ones(1,y1); for i=1:y1 A=ones(y+1,1); A(1,1)=1;A(2,1)=Y(1,1); B=ones(y+1,1); B(1,1)=0;B(2,1)=1; for k=3:y+1 A(k,1)=A(k-1,1)*Y(1,k-1)+(X(1,i)-Z(k-2))*A(k-2,1); B(k,1)=B(k-1,1)*Y(1,k-1)+(X(1,i)-Z(k-2))*B(k-2,1); end c(1,i)=A(y+1,1)/B(y+1,1); end end function Z=netwondis(z,x,y)%輸出插商的值,z為待插值點,x為原插值點,y為插商值 hangz=size(z,1); Z=ones(hangz,1); x=x'; hangx=size(x,1); for k=1:hangx if(k==1) Z(:,1)=y(1,1); S=z-x(1,1); else Z=Z+y(1,k)*S; S=S.*(z-x(k,1)); end end Z=Z'; end
基于自適應的超分辨率圖像重建
function B1=tuxiangcj(X,apha,p)%X為待處理圖片,apha為放大倍數,先假設為2,區分平坦塊系數 %預處理,先將X規范化,能進行4*4的塊運算 X=im2double(X); [x,y]=size(X); A=X; if(mod(x,2)~=0) A=[A;A(x,:)]; end if(mod(y,2)~=0) A=[A,A(:,y)]; end %對圖像進行放大 [x1,y1]=size(A); x2=x1*apha;y2=y1*apha; B=zeros(x2,y2);%生成插值后矩陣模板 for i=apha:apha:x2 for j=apha:apha:y2 B(i,j)=A(i/apha,j/apha); end end%將原圖像的值對應賦予新圖像的位置 B1=B; %對圖像進行紋理塊或平坦塊判斷; for i=1:2:x1-2 for j=1:2:y1-2 L=[A(i,j),A(i,j+1),A(i,j+2),A(i,j+3); A(i+1,j),A(i+1,j+1),A(i+1,j+2),A(i+1,j+3); A(i+2,j),A(i+2,j+1),A(i+2,j+2),A(i+2,j+3); A(i+3,j),A(i+3,j+1),A(i+3,j+2),A(i+3,j+3)]; x=panduan(L,p); if(x==1)%對平坦塊使用牛頓牛頓法 L1=netnetwon([0.1 0.2 0.3 0.4],[0.1 0.2 0.3 0.4],L,[0.05 0.05;0.1 0.1;0.15 0.15;0.2 0.2;0.25 0.25;0.3 0.3;0.35 0.35;0.4 0.4]);%X,Y,Z為插值點坐標,T為待插值點坐標橫縱坐標,P為T的插值結果 else L1=netwon2([0.1 0.2 0.3 0.4],[0.1 0.2 0.3 0.4],L,[0.05 0.05;0.1 0.1;0.15 0.15;0.2 0.2;0.25 0.25;0.3 0.3;0.35 0.35;0.4 0.4]);%X,Y,Z為插值點坐標,T為待插值點坐標橫縱坐標,P為T的插值結果 end if(i==1&&j==1) B1(2*i-1:2*i+6,2*j-1:2*j+6)=L1; end if(i==1&&j~=1) L2=(L1(1:8,1:4)+B1(2*i-1:2*i+6,2*j-1:2*j+2))./2; L1=[L2,L1(1:8,5:8)]; B1(2*i-1:2*i+6,2*j-1:2*j+6)=L1; end if(i~=1&&j==1) L2=(L1(1:4,1:8)+B1(2*i-1:2*i+2,2*j-1:2*j+6))./2; L1=[L2;L1(5:8,1:8)]; B1(2*i-1:2*i+6,2*j-1:2*j+6)=L1; end if(i~=1&&j~=1) L2=(L1(1:4,1:8)+B1(2*i-1:2*i+2,2*j-1:2*j+6))./2; L3=(L1(1:8,1:4)+B1(2*i-1:2*i+6,2*j-1:2*j+2))./2; L4=(L2(1:4,1:4)+L3(1:4,1:4))./2; L1=[L4,L2(1:4,5:8);L3(5:8,1:4),L1(5:8,5:8)]; B1(2*i-1:2*i+6,2*j-1:2*j+6)=L1; end end end B1=im2uint8(B1); imshow(B1); end function X=panduan(A,p) B=sum(sum(A))/16; s=0; for i1=1:4 for j1=1:4 s=s+(B-A(i1,j1))^2; end end if(s<p) X=1; else X=0; end end
function B2=netwon2(X,Y,Z,T)%X,Y,Z為插值點坐標,T為待插值點坐標橫縱坐標,P為T的插值結果 M=Z'; [n,m]=size(M);%取得插值矩陣的大小 %首先對x方向newton遞推 M1=zeros(n,m); for i1=1:n L=M(i1,:); S=netwon(X,L);%對每一行進行牛頓遞推 M1(i1,:)=S; end %然后對y方向進行thiele遞推 M2=zeros(n,m); k2=0; for j1=1:m L1=M1(:,j1); L1=L1'; [S1,k1]=nichashang(Y,L1); M2(:,j1)=S1; if(k1==1) k2=1; break; end end if(k2==1) M2=zeros(n,m); for j1=1:m L1=M1(:,j1); L1=L1'; S1=netwon(Y,L1); M2(:,j1)=S1; end end %利用M2表中的值來計算y待插值點值 [n1,m1]=size(T); A1=T(:,2); A1=A1';%獲得y的坐標 A2=zeros(m,n1); if(k2~=1) for j1=1:m L1=M2(:,j1); L1=L1'; L2=thieledis(A1,L1,Y); A2(j1,:)=L2; end else for j1=1:m L1=M2(:,j1); L1=L1'; L2=netwondis(A1,Y,L1); A2(j1,:)=L2; end end %計算(x,y)待插值點; B1=T(:,1); B1=B1'; B2=zeros(n1,n1); for i1=1:n1 l1=A2(:,i1); l1=l1'; Z=netwondis(B1,X,l1); Z=Z'; B2(i1,:)=Z; end end function S=netwon(x,y) x=x';y=y';%轉致 hangx=size(x,1);%獲取x的行數; H=ones(hangx,hangx);%生成行數等于x的矩陣,用來存取系數 for j=1:hangx%這個循環是算法核心,即那個倒三角的表 if(j==1) H(:,1)=y; else for i=j:hangx H(i,j)=(H(i,j-1)-H(i-1,j-1))/(x(i,1)-x(i-j+1,1)); end end end S=zeros(1,hangx); for i=1:hangx S(1,i)=H(i,i); end end function [c,k1]=nichashang(a,b)%計算逆插商的值 [x,y]=size(a); d=zeros(y,y); c=ones(1,y); k1=0; for j=1:y if(j==1) for i=1:y d(i,1)=b(1,i); end else for i=j:y if(abs(d(i,j-1)-d(j-1,j-1))<0.0001) k1=1; break; end d(i,j)=(a(1,i)-a(1,j-1))/(d(i,j-1)-d(j-1,j-1)); end if(k1==1) break; end end if(k1==1) break; end end for k=1:y c(1,k)=d(k,k); end c=c'; end function c=thieledis(X,Y,Z)%x為待求點值,y為thiele多項式系數,z為原插值點值 y=size(Y,2); y1=size(X,2); c=ones(1,y1); for i=1:y1 A=ones(y+1,1); A(1,1)=1;A(2,1)=Y(1,1); B=ones(y+1,1); B(1,1)=0;B(2,1)=1; for k=3:y+1 A(k,1)=A(k-1,1)*Y(1,k-1)+(X(1,i)-Z(k-2))*A(k-2,1); B(k,1)=B(k-1,1)*Y(1,k-1)+(X(1,i)-Z(k-2))*B(k-2,1); end c(1,i)=A(y+1,1)/B(y+1,1); end end function Z=netwondis(z,x,y)%輸出插商的值,z為待插值點,x為原插值點,y為插商值 hangz=size(z,1); Z=ones(hangz,1); x=x'; hangx=size(x,1); for k=1:hangx if(k==1) Z(:,1)=y(1,1); S=z-x(1,1); else Z=Z+y(1,k)*S; S=S.*(z-x(k,1)); end end Z=Z'; end

function B2=netnetwon(X,Y,Z,T) M=Z'; [n,m]=size(M);%取得插值矩陣的大小 %首先對x方向newton遞推 M1=zeros(n,m); for i1=1:n L=M(i1,:); S=netwon(X,L);%對每一行進行牛頓遞推 M1(i1,:)=S; end %然后對y方向進行netwon遞推 M2=zeros(n,m); for j1=1:m L1=M1(:,j1); L1=L1'; S1=netwon(Y,L1); M2(:,j1)=S1; end %利用M2表中的值來計算y待插值點值 [n1,m1]=size(T); A1=T(:,2); A1=A1';%獲得y的坐標 A2=zeros(m,n1); for j1=1:m L1=M2(:,j1); L1=L1'; L2=netwondis(A1,Y,L1); A2(j1,:)=L2; end %計算(x,y)待插值點; B1=T(:,1); B1=B1'; B2=zeros(n1,n1); for i1=1:n1 l1=A2(:,i1); l1=l1'; Z=netwondis(B1,X,l1); B2(i1,:)=Z; end end function S=netwon(x,y) x=x';y=y';%轉致 hangx=size(x,1);%獲取x的行數; H=ones(hangx,hangx);%生成行數等于x的矩陣,用來存取系數 for j=1:hangx%這個循環是算法核心,即那個倒三角的表 if(j==1) H(:,1)=y; else for i=j:hangx H(i,j)=(H(i,j-1)-H(i-1,j-1))/(x(i,1)-x(i-j+1,1)); end end end S=zeros(1,hangx); for i=1:hangx S(1,i)=H(i,i); end end function Z=netwondis(z,x,y)%輸出插商的值,z為待插值點,x為原插值點,y為插商值 hangz=size(z,1); Z=ones(hangz,1); x=x'; hangx=size(x,1); for k=1:hangx if(k==1) Z(:,1)=y(1,1); S=z-x(1,1); else Z=Z+y(1,k)*S; S=S.*(z-x(k,1)); end end end
由于這程序比較簡陋,很多地方沒有重構和優化,故運行有點慢,效果一般。下一步優化算法,改成對彩色圖像處理。
示例:
修復前:

test2.jpg

修復后:


test4.jpg
test3.jpg

由于算法細節沒有弄好,細節上與matlab有些差別,大家一起來優化算法。
2016.08.05
再更新下彩色圖像版,只有主程序變動,但是效果很差
function H=tuxiangcj(X,apha,p)%X為待處理圖片,apha為放大倍數,先假設為2,區分平坦塊系數 %預處理,先將X規范化,能進行4*4的塊運算 R=X(:,:,1); G=X(:,:,2); B=X(:,:,3); R=im2double(R); G=im2double(G); B=im2double(B); [x,y]=size(R); R1=R; if(mod(x,2)~=0) R1=[R1;R1(x,:)]; end if(mod(y,2)~=0) R1=[R1,R1(:,y)]; end G1=G; if(mod(x,2)~=0) G1=[G1;G1(x,:)]; end if(mod(y,2)~=0) G1=[G1,G1(:,y)]; end B1=B; if(mod(x,2)~=0) B1=[B1;B1(x,:)]; end if(mod(y,2)~=0) B1=[B1,B1(:,y)]; end %對圖像進行放大 [x1,y1]=size(R1); x2=x1*apha;y2=y1*apha; R2=zeros(x2,y2);%生成插值后矩陣模板 for i=apha:apha:x2 for j=apha:apha:y2 R2(i,j)=R1(i/apha,j/apha); end end%將原圖像的值對應賦予新圖像的位置 B2=zeros(x2,y2);%生成插值后矩陣模板 for i=apha:apha:x2 for j=apha:apha:y2 B2(i,j)=B1(i/apha,j/apha); end end%將原圖像的值對應賦予新圖像的位置 G2=zeros(x2,y2);%生成插值后矩陣模板 for i=apha:apha:x2 for j=apha:apha:y2 G2(i,j)=G1(i/apha,j/apha); end end%將原圖像的值對應賦予新圖像的位置 %對圖像進行紋理塊或平坦塊判斷; for i=1:2:x1-2 for j=1:2:y1-2 L1=[R1(i,j),R1(i,j+1),R1(i,j+2),R1(i,j+3); R1(i+1,j),R1(i+1,j+1),R1(i+1,j+2),R1(i+1,j+3); R1(i+2,j),R1(i+2,j+1),R1(i+2,j+2),R1(i+2,j+3); R1(i+3,j),R1(i+3,j+1),R1(i+3,j+2),R1(i+3,j+3)]; L2=[G1(i,j),G1(i,j+1),G1(i,j+2),G1(i,j+3); G1(i+1,j),G1(i+1,j+1),G1(i+1,j+2),G1(i+1,j+3); G1(i+2,j),G1(i+2,j+1),G1(i+2,j+2),G1(i+2,j+3); G1(i+3,j),G1(i+3,j+1),G1(i+3,j+2),G1(i+3,j+3)]; L3=[B1(i,j),B1(i,j+1),B1(i,j+2),B1(i,j+3); B1(i+1,j),B1(i+1,j+1),B1(i+1,j+2),B1(i+1,j+3); B1(i+2,j),B1(i+2,j+1),B1(i+2,j+2),B1(i+2,j+3); B1(i+3,j),B1(i+3,j+1),B1(i+3,j+2),B1(i+3,j+3)]; x=panduan(L1,L2,L3,p); if(x==1)%對平坦塊使用牛頓牛頓法 RL=netnetwon([0.1 0.2 0.3 0.4],[0.1 0.2 0.3 0.4],L1,[0.05 0.05;0.1 0.1;0.15 0.15;0.2 0.2;0.25 0.25;0.3 0.3;0.35 0.35;0.4 0.4]);%X,Y,Z為插值點坐標,T為待插值點坐標橫縱坐標,P為T的插值結果 GL=netnetwon([0.1 0.2 0.3 0.4],[0.1 0.2 0.3 0.4],L2,[0.05 0.05;0.1 0.1;0.15 0.15;0.2 0.2;0.25 0.25;0.3 0.3;0.35 0.35;0.4 0.4]);%X,Y,Z為插值點坐標,T為待插值點坐標橫縱坐標,P為T的插值結果 BL=netnetwon([0.1 0.2 0.3 0.4],[0.1 0.2 0.3 0.4],L3,[0.05 0.05;0.1 0.1;0.15 0.15;0.2 0.2;0.25 0.25;0.3 0.3;0.35 0.35;0.4 0.4]);%X,Y,Z為插值點坐標,T為待插值點坐標橫縱坐標,P為T的插值結果 else RL=netwon2([0.1 0.2 0.3 0.4],[0.1 0.2 0.3 0.4],L1,[0.05 0.05;0.1 0.1;0.15 0.15;0.2 0.2;0.25 0.25;0.3 0.3;0.35 0.35;0.4 0.4]);%X,Y,Z為插值點坐標,T為待插值點坐標橫縱坐標,P為T的插值結果 GL=netwon2([0.1 0.2 0.3 0.4],[0.1 0.2 0.3 0.4],L2,[0.05 0.05;0.1 0.1;0.15 0.15;0.2 0.2;0.25 0.25;0.3 0.3;0.35 0.35;0.4 0.4]);%X,Y,Z為插值點坐標,T為待插值點坐標橫縱坐標,P為T的插值結果 BL=netwon2([0.1 0.2 0.3 0.4],[0.1 0.2 0.3 0.4],L3,[0.05 0.05;0.1 0.1;0.15 0.15;0.2 0.2;0.25 0.25;0.3 0.3;0.35 0.35;0.4 0.4]);%X,Y,Z為插值點坐標,T為待插值點坐標橫縱坐標,P為T的插值結果 end if(i==1&&j==1) R2(2*i-1:2*i+6,2*j-1:2*j+6)=RL; G2(2*i-1:2*i+6,2*j-1:2*j+6)=GL; B2(2*i-1:2*i+6,2*j-1:2*j+6)=BL; end if(i==1&&j~=1) RL2=(RL(1:8,1:4)+R2(2*i-1:2*i+6,2*j-1:2*j+2))./2; RL1=[RL2,RL(1:8,5:8)]; R2(2*i-1:2*i+6,2*j-1:2*j+6)=RL1; GL2=(GL(1:8,1:4)+G2(2*i-1:2*i+6,2*j-1:2*j+2))./2; GL1=[GL2,GL(1:8,5:8)]; G2(2*i-1:2*i+6,2*j-1:2*j+6)=GL1; BL2=(BL(1:8,1:4)+B2(2*i-1:2*i+6,2*j-1:2*j+2))./2; BL1=[BL2,BL(1:8,5:8)]; B2(2*i-1:2*i+6,2*j-1:2*j+6)=BL1; end if(i~=1&&j==1) RL2=(RL(1:4,1:8)+R2(2*i-1:2*i+2,2*j-1:2*j+6))./2; RL1=[RL2;RL(5:8,1:8)]; R2(2*i-1:2*i+6,2*j-1:2*j+6)=RL1; GL2=(GL(1:4,1:8)+G2(2*i-1:2*i+2,2*j-1:2*j+6))./2; GL1=[GL2;GL(5:8,1:8)]; G2(2*i-1:2*i+6,2*j-1:2*j+6)=GL1; BL2=(BL(1:4,1:8)+B2(2*i-1:2*i+2,2*j-1:2*j+6))./2; BL1=[BL2;BL(5:8,1:8)]; B2(2*i-1:2*i+6,2*j-1:2*j+6)=BL1; end if(i~=1&&j~=1) RL2=(RL(1:4,1:8)+R2(2*i-1:2*i+2,2*j-1:2*j+6))./2; RL3=(RL(1:8,1:4)+R2(2*i-1:2*i+6,2*j-1:2*j+2))./2; RL4=(RL2(1:4,1:4)+RL3(1:4,1:4))./2; RL1=[RL4,RL2(1:4,5:8);RL3(5:8,1:4),RL1(5:8,5:8)]; R2(2*i-1:2*i+6,2*j-1:2*j+6)=RL1; GL2=(GL(1:4,1:8)+G2(2*i-1:2*i+2,2*j-1:2*j+6))./2; GL3=(GL(1:8,1:4)+G2(2*i-1:2*i+6,2*j-1:2*j+2))./2; GL4=(GL2(1:4,1:4)+GL3(1:4,1:4))./2; GL1=[GL4,GL2(1:4,5:8);GL3(5:8,1:4),GL1(5:8,5:8)]; G2(2*i-1:2*i+6,2*j-1:2*j+6)=GL1; BL2=(BL(1:4,1:8)+B2(2*i-1:2*i+2,2*j-1:2*j+6))./2; BL3=(BL(1:8,1:4)+B2(2*i-1:2*i+6,2*j-1:2*j+2))./2; BL4=(BL2(1:4,1:4)+BL3(1:4,1:4))./2; BL1=[BL4,BL2(1:4,5:8);BL3(5:8,1:4),BL1(5:8,5:8)]; B2(2*i-1:2*i+6,2*j-1:2*j+6)=BL1; end end end R2=im2uint8(R2); G2=im2uint8(G2); B2=im2uint8(B2); H(:,:,1)=R2; H(:,:,2)=G2; H(:,:,3)=B2; imshow(H); end function X=panduan(R,G,B,p) S1=sum(sum(R))/16; S2=sum(sum(G))/16; S3=sum(sum(B))/16; s=0; for i1=1:4 for j1=1:4 s=s+(S1-R(i1,j1))^2+(S2-G(i1,j1))^2+(S3-B(i1,j1))^2; end end if(s<p) X=1; else X=0; end end

N-T算法優化----考慮奇異點的情況
function Z1=NT(X,Y,Z,X1,Y1)%X,Y,Z為插值點坐標,T為待插值點坐標橫縱坐標,P為T的插值結果 M=Z'; [n,m]=size(M);%取得插值矩陣的大小 %首先對x方向newton遞推 x=X(1,:); M1=zeros(n,m); for i1=1:n L=M(i1,:); S=netwon(x,L);%對每一行進行牛頓遞推 M1(i1,:)=S; end %然后對y方向進行thiele遞推 y=Y(:,1)'; M2=zeros(n,m); P=zeros(1,m); for j1=1:m L1=M1(:,j1); L1=L1'; [S1,p]=thiele1(y,L1); P(1,j1)=p; M2(:,j1)=S1; end %利用M2表中的值來計算y待插值點值 y1=Y1(:,1)'; n1=size(y1,2); %獲得y的坐標 A2=zeros(m,n1); for j1=1:m L1=M2(:,j1); L1=L1'; L2=thieledis1(y1,L1,y,P(1,j1)); A2(j1,:)=L2; end %計算(x,y)待插值點; x1=X1(1,:); m1=size(x1,2); Z1=zeros(n1,m1); %獲取x坐標 for i1=1:n1 l1=A2(:,i1); l1=l1'; Z=netwondis(x1,l1,x); Z=Z'; Z1(i1,:)=Z; end end function S=netwon(x,y) x=x';y=y';%轉致 hangx=size(x,1);%獲取x的行數; H=ones(hangx,hangx);%生成行數等于x的矩陣,用來存取系數 for j=1:hangx%這個循環是算法核心,即那個倒三角的表 if(j==1) H(:,1)=y; else for i=j:hangx H(i,j)=(H(i,j-1)-H(i-1,j-1))/(x(i,1)-x(i-j+1,1)); end end end S=zeros(1,hangx); for i=1:hangx S(1,i)=H(i,i); end end
function C=thieledis1(X,Y,Z,p)%X為待插值點,Y為逆差商,Z為原插值節點橫坐標,p為奇異點坐標 XH=size(X,2); YH=size(Y,2); if(p~=0) c=netwondis(X,Y(1,p+1:YH),Z(1,p+1:YH)); c=c'; c1=(X-Z(1,p)).*c+Y(1,p); for i=1:XH if(c1(1,i)>0.0001) C=thieledis(X,[Y(1,1:p-1),c1(1,i)],Z(1,1:p)); else C=thieledis(X,Y(1,1:p-1),Z(1,1:(p-1))); end end else C=thieledis(X,Y,Z); end end function Z=netwondis(z,y,x)%輸出插商的值,z為待插值點,x為原插值點,y為插商值 hangz=size(z,1); Z=ones(hangz,1); x=x'; hangx=size(x,1); for k=1:hangx if(k==1) Z(:,1)=y(1,1); S=z-x(1,1); else Z=Z+y(1,k)*S; S=S.*(z-x(k,1)); end end Z=Z'; end function c=thieledis(X,Y,Z)%x為待求點值,y為thiele多項式系數,z為原插值點值 y=size(Y,2); y1=size(X,2); c=ones(1,y1); for i=1:y1 A=ones(y+1,1); A(1,1)=1;A(2,1)=Y(1,1); B=ones(y+1,1); B(1,1)=0;B(2,1)=1; for k=3:y+1 A(k,1)=A(k-1,1)*Y(1,k-1)+(X(1,i)-Z(k-2))*A(k-2,1); B(k,1)=B(k-1,1)*Y(1,k-1)+(X(1,i)-Z(k-2))*B(k-2,1); end c(1,i)=A(y+1,1)/B(y+1,1); end end

function c=thieledis(X,Y,Z)%x為待求點值,y為thiele多項式系數,z為原插值點值 y=size(Y,2); y1=size(X,2); c=ones(1,y1); for i=1:y1 A=ones(y+1,1); A(1,1)=1;A(2,1)=Y(1,1); B=ones(y+1,1); B(1,1)=0;B(2,1)=1; for k=3:y+1 A(k,1)=A(k-1,1)*Y(1,k-1)+(X(1,i)-Z(k-2))*A(k-2,1); B(k,1)=B(k-1,1)*Y(1,k-1)+(X(1,i)-Z(k-2))*B(k-2,1); end c(1,i)=A(y+1,1)/B(y+1,1); end end

function Z=netwondis(z,y,x)%輸出插商的值,z為待插值點,x為原插值點,y為插商值 hangz=size(z,1); Z=ones(hangz,1); x=x'; hangx=size(x,1); for k=1:hangx if(k==1) Z(:,1)=y(1,1); S=z-x(1,1); else Z=Z+y(1,k)*S; S=S.*(z-x(k,1)); end end Z=Z'; end
function C=thieledis1(X,Y,Z,p)%X為待插值點,Y為逆差商,Z為原插值節點橫坐標,p為奇異點坐標 XH=size(X,2); YH=size(Y,2); if(p~=0) c=netwondis(X,Y(1,p+1:YH),Z(1,p+1:YH)); c=c'; c1=(X-Z(1,p)).*c+Y(1,p); for i=1:XH if(c1(1,i)>0.0001) C=thieledis(X,[Y(1,1:p-1),c1(1,i)],Z(1,1:p)); else C=thieledis(X,Y(1,1:p-1),Z(1,1:(p-1))); end end else C=thieledis(X,Y,Z); end end
function [c,count]=thiele1(a,b)%a,b為待插值點的坐標 y=size(a,2); d=zeros(y,y); c=ones(1,y); count=0; p=0; for j=1:y if(j==1) for i=1:y d(i,1)=b(1,i); end else %若逆差商為0,轉換為差商 for i=j:y if(abs(d(i,j-1)-d(j-1,j-1))>0.0000001&&p==0) d(i,j)=(a(1,i)-a(1,j-1))/(d(i,j-1)-d(j-1,j-1)); else d(i,j)=(d(i,j-1)-d(i-1,j-1))/(a(1,i)-a(1,i-j+1)); if(p==0) count=j; p=1; end end end end end for k=1:y c(1,k)=d(k,k); end end

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容

  • 金融創新不僅僅是指金融產品的創新,也包括金融制度、金融服務、金融流程等的創新,例如我們的支付工具、支付方式、募資渠...
    韓魚魚閱讀 438評論 0 1
  • 九份和金瓜石都屬于同一條旅游線路,都坐落于瑞芳區基隆山。第一天呆在九份品味九份的雨天,第二天我們啟程去到金瓜石黃金...
    霹靂酷錘錘閱讀 1,859評論 0 9
  • 這個話題一開始想到的是和孩子教育相關的懲罰,不過仔細想了想,我在教育孩子上面幾乎沒有過懲罰。苦于沒有內容寫,就拖到...
    李聘2023閱讀 111評論 0 0
  • 我的簡書生活,自此開始。
    詡菇涼閱讀 252評論 0 0