簡體   English   中英

Matlab中的三維(3D)矩陣插值

[英]Three dimensional (3D) matrix interpolation in Matlab

我在Matlab中有一個特定大小的3D矩陣,但是我需要對其進行插值以獲得更大尺寸的矩陣。

size(M)
ans= 
  50   108    86

我需要對該矩陣進行插值並最終獲得大小為100x213x140的矩陣。 關於如何使用interp3任何想法? 這有可能嗎?

我試過了

Vq = interp3(M,1:100,1:213,1:140)
Error using griddedInterpolant/subsref
The input data has inconsistent size.

Error in interp3 (line 178)
    Vq = F(Xq,Yq,Zq);

如果我使用meshgrid

[X,Y,Z] = meshgrid(1:100, 1:213, 1:140);
Vq =interp3(M,X,Y,Z);

Matlab似乎很喜歡它,但是發生了兩件事:

  1. size(Vq) ans= 213 100 140
  2. 我可以在Vq看到NaN

背后的原因是因為我需要比較以不同頻率采樣的兩個矩陣。 所以,我既可以插M獲得大小的矩陣100x213x140或“減少”我的其他矩陣大小M2的尺寸100x213x14050x108x86 我認為前者應該更容易,更安全。

您幾乎是正確的。 您需要定義坐標的3D網格 創建單個向量不是正確的方法。 您當然可以在這里使用interp3 嘗試做:

[X,Y,Z] = meshgrid(1:213, 1:100, 1:140);
Vq = interp3(M, X, Y, Z);

請注意,我已經交換了行(100)和列(213)的限制,因為第一個參數是水平進行的,而第二個參數是垂直進行的。

同樣,通過以這種方式使用interp3 ,我們假設XYZ的限制落在1:213 interp3 1:1001:140 如果您提供超出這些限制的任何值,則將獲得NaN 有兩種方法可以避免這種情況:

  1. 在末尾指定spline標志以允許樣條線外推
  2. 如果要調整矩陣的大小 (例如要調整圖像的大小),則當前沒有內置方法可以以此方式調整3D矩陣的大小。 您必須自己編寫。

如果要執行步驟2,則可以執行以下操作。

首先,您需要找出每個維度的比例因子。 基本上,這是每個尺寸的輸出尺寸與原始輸入尺寸的比率。

此后,您將創建一個2D網格,其限制由輸入矩陣的原始大小限制,但是此網格的大小將與輸出矩陣的大小相同。 比例因子在這里很有用,因為這可以有效地給我們網格中每個值都應該進行插值。 我們將創建新的坐標,該坐標從1到每個維度的輸出大小,以1/scaleFactor為增量。 例如,如果我們想將矩陣的大小加倍 ,這是2的倍數。如果我們的XY坐標分別從1變為3和1到3,原始網格將如下所示:

X =            Y = 

1  2  3        1  1  1
1  2  3        2  2  2
1  2  3        3  3  3

要加倍,這將是:

X =                         Y = 

1  1.5  2  2.5  3           1   1   1   1   1
1  1.5  2  2.5  3          1.5 1.5 1.5 1.5 1.5
1  1.5  2  2.5  3           2   2   2   2   2
1  1.5  2  2.5  3          2.5 2.5 2.5 2.5 2.5 
1  1.5  2  2.5  3           3   3   3   3   3

請注意,這將創建一個5 x 5的輸出網格。要將其倍增為6 x 6,您可以執行任意操作,但是為了簡單起見,只需復制最后一行和最后一列,如此:

X =                         Y = 

1  1.5  2  2.5  3  3         1   1   1   1   1   1
1  1.5  2  2.5  3  3        1.5 1.5 1.5 1.5 1.5 1.5
1  1.5  2  2.5  3  3         2   2   2   2   2   2
1  1.5  2  2.5  3  3        2.5 2.5 2.5 2.5 2.5 2.5
1  1.5  2  2.5  3  3         3   3   3   3   3   3
1  1.5  2  2.5  3  3         3   3   3   3   3   3

這定義了我們的2D列網格以調整大小。 現在是3D尺寸調整的問題。 我們可以做的是在切片之間進行插值。 我們可以使用MATLAB中的permute輕松地做到這一點,稍后我將向您展示如何做到這一點。 因此,基本算法是這樣的:

  • 確定所需輸出矩陣的輸出大小
  • 確定每個維度的比例因子
  • 按照上述步驟為每個維度創建一個內插訪問值的2D網格
  • 對於矩陣中的每個2D切片,請使用interp2使用上述2D網格將每個切片調整為輸出行和列的大小。
  • 之后,使用interp1permute以調整第三維的大小。

事不宜遲,下面是執行此操作的代碼:

%// Specify output size of your matrix here
outputSize = [100 213 140];

%//Figure out size of original matrix
d = size(M);

%//Scaling coefficients
scaleCoeff = outputSize ./ d;

%//Indices of original slices in 3D
z = 1:d(3);

%//Output slice indices in 3D
zi=1:1/scaleCoeff(3):d(3);

%//Create gridded interpolated co-ordinates for 1 slice
[X,Y] = meshgrid(1:1/scaleCoeff(2):d(2), 1:1/scaleCoeff(1):d(1));

%//We simply duplicate the last rows and last columns of the grid if
%//by doing meshgrid, we don't get exactly the output size we want
%//This is due to round off when perform 1/scaleCoeff(2) or
%//1/scaleCoeff(1).  We would be off by 1.
if size(X,1) ~= outputSize(1)
    X(end+1,:) = X(end,:);
    Y(end+1,:) = Y(end,:);
end
if size(X,2) ~= outputSize(2)
    X(:,end+1) = X(:,end);
    Y(:,end+1) = X(:,end);
end

%//For each slice...
M2D = zeros(outputSize(1), outputSize(2), d(3));
for ind = z
    %//Interpolate each slice via interp2
    M2D(:,:,ind) = interp2(M(:,:,ind), X, Y);
end

%//Now interpolate in 3D
MFinal = permute(interp1(z,permute(M2D,[3 1 2]),zi),[2 3 1]);

%//If the number of output slices don't match after we interpolate in 3D, we
%//just duplicate the last slice again
if size(MFinal,3) ~= outputSize(3)
    MFinal(:,:,end+1) = MFinal(:,:,end);
end

MFinal將是您最終插入/調整大小的3D矩陣。 在3D中進行插值的關鍵方法是permute方法。 這將為z每個值生成一個二維的值切片。 這樣,如果我們在z = 1處有一個切片,在z = 2處有一個切片,如果我們想找到切片z = 1.5處的二維值網格,則將生成一個二維切片,該切片使用信息創建這些插值在z = 1z = 2 我們做的第一個電話permute要做到這一點,那么另一個permute呼吁取消我們的置換,並獲得原始尺寸回來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM