我的矩阵是这样的:
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.
为什么?我怎样才能恢复原始矩阵?
答案 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