可以調用樣條工具箱(Spline ToolBox)
csapi
clear;clc
z0=double(rgb2gray(imread('1.jpg'))); %讀取數據
x0=1:size(z0,1);y0=1:size(z0,2);
sp=csapi({x0 y0},z0);%得到每片三次樣條曲面的系數
fnplt(sp); %可得到擬合曲面的效果圖
vals = fnval(sp,{x0 y0});%計算擬合后的數據
---------------------------------------------------------------------------------------------------------------
spap2
clc; clear; close all;
z=[0.2 0.24 0.25 0.26 0.25 0.25 0.25 0.26 0.26 0.29 0.25 0.29;
0.27 0.31 0.3 0.3 0.26 0.28 0.29 0.26 0.26 0.26 0.26 0.29;
0.41 0.41 0.37 0.37 0.38 0.35 0.34 0.35 0.35 0.34 0.35 0.35;
0.41 0.42 0.42 0.41 0.4 0.39 0.39 0.38 0.36 0.36 0.36 0.36;
0.3 0.36 0.4 0.43 0.45 0.45 0.51 0.42 0.4 0.37 0.37 0.37];
% z=double(rgb2gray(imread('1.jpg')));
x=1:size(z,2);%長為12
y=1:size(z,1);%寬為5
[x0, y0] = meshgrid(x, y);%產生采樣網格
surf(x,y,z);%畫出原始數據的三維圖
title('Original data Plot');
xlabel('X'), ylabel('Y'), zlabel('Z')
% colormap; colorbar;
% axis([0 15 0 6 0.15 0.55]);
% hold on;
% plot3(x0, y0, z, 'p');
figure;
ky = 3; knotsy = augknt([1,2.5,13],ky);%設置節點序列1 1 1 2.5 13 13 13
%augknt(knots,k)意義是產生一個逐增的節點序列,並且頭和尾節點重復為k個,
%如augknt([1 2 3 3 3 4 4 4 4],2)和augknt([1 2 3 3 3 4],2)得到結果一樣
%1 1 2 3 3 3 4 4
sp = spap2(knotsy,ky,y,z');%根據最小二乘准則的B樣條擬合
yy = 1:size(z,1); vals = fnval(sp,yy);%計算擬合的數據
fnplt(sp); %畫出擬合效果圖