在Matlab中使用col2im重新排列矩阵

时间:2013-12-10 15:10:42

标签: matlab matrix

我的矩阵是这样的:

 0     3     0
 0     1     2
 4     4     1

我在其上使用im2col

 im2col(A, [2 2], 'sliding')

正确地产生了这个:

 0     0     3     1
 0     4     1     4
 3     1     0     2
 1     4     2     1

我称之为矩阵K。现在我使用col2im返回原始矩阵。从Matlab文档中我使用:

col2im(K, [2 2], [5 5],'sliding')

但这并没有给我原始矩阵A[5 5]的原因应为[4 4],以便为初学者提供3 * 3矩阵。但是当我这样做时,我得到了

??? Error using ==> reshape
To RESHAPE the number of elements must not change.

为什么?我怎样才能恢复原始矩阵?

3 个答案:

答案 0 :(得分:0)

来自文档:

  

A = col2im(B,[m n],[mm nn],'sliding')将行向量B重新排列为   尺寸(mm-m + 1)-by-(nn-n + 1)的矩阵。 B必须是大小的向量   1逐(毫米-M + 1)*(NN-N + 1)。 B通常是处理的结果   使用列压缩函数输出im2col(...,'sliding')   (如总和)。

所以这对我说你应该尝试类似的事情:

col2im(sum(K), [2 2], [4 4],'sliding')

然而,K需要9列。我没有方便的图像处理工具箱来测试这个

答案 1 :(得分:0)

您的col2im不起作用,因为它使用reshape,因此您希望重塑(K)和新的矩阵的元素数量需要相同。情况已经不是这样了,因为通过使用im2col转换A,您显然已经改变了。 A有9和K 16元素。

所以你基本上需要通过去除K中的冗余和加倍元素(由于im2col中使用的重叠2 * 2块)再次回到3 * 3矩阵。 为此你可以用你需要的元素制作一个新的矩阵(C):

C = [K([1,3,11;2,4,12;6,8,16])]

只要您首先使用相同的块顺序从3 * 3到4 * 4矩阵,这应该有效。

也许您可以告诉我们更多关于您真正希望实现的目标,因为我首先没有看到任何理由。你可能也可能更好地使用其他功能,但我只能看到,如果我知道你的问题背后的原因是什么。

答案 2 :(得分:0)

clear
clc
img = double(imread('tire.tif'));
[r c] = size(img);
w = 8;
imgBlock = im2col(img,[w w],'sliding'); imgBlock = imgBlock(:);
[x y] = meshgrid(1:c,1:r);
xx = im2col(x,[w w], 'sliding'); xx = xx(:);
yy = im2col(y,[w w], 'sliding'); yy = yy(:);
img2 = accumarray([yy xx], imgBlock, [], @mean);
figure,imshow(img, []);
figure,imshow(img2,[]);

%随机矩阵作为图像

img = randi(10,4)

img =

 6     2     2     7
 5     8     7     8
 1     4     3     5
 4     6     7     1

%矩阵大小

[r c] = size(img)

%补丁大小

w = 2;

%image to patch

imgBlock = im2col(img,[w w],'滑动')

%image将矩阵修补为矢量

imgBlock = imgBlock(:);

r =

 4

c =

 4

imgBlock =

 6     5     1     2     8     4     2     7     3
 5     1     4     8     4     6     7     3     7
 2     8     4     2     7     3     7     8     5
 8     4     6     7     3     7     8     5     1

%索引矩阵大小等于图像大小

[x y] = meshgrid(1:c,1:r)

%index matric to patchs; to vector

xx = im2col(x,[w w],'滑动'); xx = xx(:);

yy = im2col(y,[w w],'滑动'); yy = yy(:);

x =

 1     2     3     4
 1     2     3     4
 1     2     3     4
 1     2     3     4

y =

 1     1     1     1
 2     2     2     2
 3     3     3     3
 4     4     4     4

%yy:行索引xx:列索引

%将函数mean应用于imgBlock中在[yy xx]中具有相同下标的每个元素子集。

img2 = accumarray([yy xx],imgBlock,[],@ mean);

IMG

IMG2

img =

 6     2     2     7
 5     8     7     8
 1     4     3     5
 4     6     7     1

img2 =

 6     2     2     7
 5     8     7     8
 1     4     3     5
 4     6     7     1

%[col,row,value]

a = [xx,yy,imgBlock]

a =

 1     1     6
 1     2     5
 2     1     2
 2     2     8
 1     2     5
 1     3     1
 2     2     8
 2     3     4
 1     3     1
 1     4     4
 2     3     4
 2     4     6
 2     1     2
 2     2     8
 3     1     2
 3     2     7
 2     2     8
 2     3     4
 3     2     7
 3     3     3
 2     3     4
 2     4     6
 3     3     3
 3     4     7
 3     1     2
 3     2     7
 4     1     7
 4     2     8
 3     2     7
 3     3     3
 4     2     8
 4     3     5
 3     3     3
 3     4     7
 4     3     5
 4     4     1

%img(2,2)在矩阵img

中出现的次数

a(xx == 2& yy == 2,:)

ans =

 2     2     8
 2     2     8
 2     2     8
 2     2     8