Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 三维矩阵中的三维面片_Matlab_Matrix_Patch - Fatal编程技术网

Matlab 三维矩阵中的三维面片

Matlab 三维矩阵中的三维面片,matlab,matrix,patch,Matlab,Matrix,Patch,我有一个3d矩阵(3x3x3),我需要提取3d面片(2x2x2),并将它们转换为向量 在2d中,简单地说: I=randi(5,3,3) 2d_patches=im2col(I,[2],“滑动”) 3d怎么样 I=randi(5,3,3,3) 3d_补丁=??? im2col只在2d中工作。在3d中,我应该重新组合向量1和7,2和8。。。 这项任务有什么快速功能吗?我不相信有任何内置的方法来完成这项任务。如果您需要它的速度,那么用c编写自己的mex函数并从Matlab调用它应该相当简单 以下是我

我有一个3d矩阵
(3x3x3)
,我需要提取3d面片
(2x2x2)
,并将它们转换为向量

在2d中,简单地说:

I=randi(5,3,3)

2d_patches=im2col(I,[2],“滑动”)

3d怎么样

I=randi(5,3,3,3)

3d_补丁=???

im2col只在2d中工作。在3d中,我应该重新组合向量
1
7
2
8
。。。
这项任务有什么快速功能吗?

我不相信有任何内置的方法来完成这项任务。如果您需要它的速度,那么用c编写自己的mex函数并从Matlab调用它应该相当简单

以下是我的(快速而肮脏的)解决方案:

im3col.c: 测试:
大家好,这个解决方案怎么样。要从中获得3x3x3 ROI,我建议:

blkSize=3; % should be a odd value like 3,5,7,etc
r=floor(blkSize/2);
k=1;

for sliceNo=(r+1):(size(I,3)-r)

   img= I(:,:,sliceNo-r:sliceNo+r);

   noPix=(size(img,1)-2*r)*(size(img,2)-2*r);
   neiblk=zeros(blkSize^3,noPix);

   for blk=1:blkSize
       neiblk(blkSize^2*(blk-1)+1:blkSize^2*blk,:)=im2col(img(:,:,blk),...
             [blkSize,blkSize],'sliding');            
   end

   ROIs(:,noPix*(k-1)+1:noPix*k)=neiblk;
   k=k+1;
end

这是另一个方向: (速度相当慢,肯定有更快的方法)


请记住,MATLAB使用col major。

对于2D情况,为什么I=randi(5,3,3)是3D数组?您可以通过反复调用2D
im2col
来创建3D版本的im2col
。如果我问这个问题,就不那么简单了。“简单”假设您有编写mex函数的经验。。。今天晚些时候,我将尝试用一些代码编辑我的答案。这就是你需要的吗?很好!它起作用了!我的Matlab代码是:<代码> [PATCHES3D] = BuudIdPaTCHES3D(席,彝,子,XP,YP,ZP)I= RANDI(3,席,彝,子);num_patch2d=(xi xp+1)*(yi yp+1);num_patch3d=(xi xp+1)*(yi yp+1)*(zi zp+1);dim_patch2d=(xp*yp);dim_patch3d=(xp*yp*zp);对于count=1:zi tmp_patch2d(:,:,count)=im2col(I(:,:,count),[xp yp],'slided');结束计数=1;对于slice_counter=1:(zi zp+1)对于col_patch=1:num_patch2d tmp=[];对于偏移量=0:(zp-1)tmp=vertcat(tmp,tmp_patch2d(:,col_patch,slice_counter+offset));末端补丁3D(:,计数)=tmp;计数=计数+1;end end
现在,我需要反向函数来恢复给定3d_面片的原始3d矩阵。我知道2d会发生什么。你有什么建议吗?提前谢谢你!
>> mex -O CFLAGS="\$CFLAGS -std=c99 -Wall" im3col.c
>> A(:,:,1) = [1,4,7;2,5,8;3,6,9]; A(:,:,2) = [10,13,16;11,14,17;12,15,18];
>> B = im3col(A, [2,2,1])

B =

     1     2     4     5    10    11    13    14
     2     3     5     6    11    12    14    15
     4     5     7     8    13    14    16    17
     5     6     8     9    14    15    17    18

>> A(:,:,1),A(:,:,2)

ans =

     1     4     7
     2     5     8
     3     6     9


ans =

    10    13    16
    11    14    17
    12    15    18
%One possible way to use matlab to call im2col and reshape twice
%N = [row, col, num_frames]

[x_height, ~, num_frames] = size(N);
patchSize = 16;
patchTemporal = 10;

N = reshape(N, x_height, []);

N = im2col(N, [patchSize, patchSize], 'distinct');

N = reshape(N, [], num_frames);

N = im2col(N, [patchSize^2, patchTemporal], 'distinct');
% N = [patchSize^2 *patchTemporal x numPatches]
blkSize=3; % should be a odd value like 3,5,7,etc
r=floor(blkSize/2);
k=1;

for sliceNo=(r+1):(size(I,3)-r)

   img= I(:,:,sliceNo-r:sliceNo+r);

   noPix=(size(img,1)-2*r)*(size(img,2)-2*r);
   neiblk=zeros(blkSize^3,noPix);

   for blk=1:blkSize
       neiblk(blkSize^2*(blk-1)+1:blkSize^2*blk,:)=im2col(img(:,:,blk),...
             [blkSize,blkSize],'sliding');            
   end

   ROIs(:,noPix*(k-1)+1:noPix*k)=neiblk;
   k=k+1;
end
function [img] = patch2im_2d_time(patch, size_img, size_patch, size_skip, border)
Nx = size_img(1);
Ny = size_img(2);
Nt = size_img(5);

psz1 = size_patch(1);
psz2 = size_patch(2);
psz3 = size_patch(3);

%Extract blocks. One could save a lot here.
patches  = reshape(patch, [psz1 psz2 psz3 size(patch,2)]);
c = 1;
img2 = zeros(squeeze(size_img));
%Count for each pixel how many times we added smth to it.
add_count = zeros(size_img);

%The first three loops, loop through all the pixels in the image
for d=1:Nt-psz3+1
    for j=1:Nx-psz2+1
        for i=1:Ny-psz1+1
            %Here we get the next patch. The next patch is always
            %the patch that has the pixel at i,j,d at its top front corner.
            current_patch = patches(:,:,:,c);
            %counter for the next patch
            c = c + 1;
            %In this loop we add the patch values of each pixel in the
            %patch to the image. i,j,d is the base. We add the offset
            %ii jj and dd to it. This iteration takes psz^3 many
            %iterations.
            for dd=1:psz3
                for ii=1:psz2
                    for jj=1:psz1
                        img2(i+ii-1,j+jj-1,d+dd-1) = img2(i+ii-1,j+jj-1,d+dd-1) + current_patch(ii,jj,dd);
                        add_count(i+ii-1,j+jj-1,d+dd-1) = add_count(i+ii-1,j+jj-1,d+dd-1) + 1;
                    end
                end
            end

        end
    end
end
    img = flipud(rot90(img2 ./ add_count,1));
end