首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用Matlab语言中的col2im实现矩阵的重排

利用Matlab语言中的col2im实现矩阵的重排
EN

Stack Overflow用户
提问于 2013-12-10 23:10:42
回答 3查看 1.3K关注 0票数 0

我的矩阵是:

代码语言:javascript
复制
 0     3     0
 0     1     2
 4     4     1

我在上面使用im2col,如下所示:

代码语言:javascript
复制
 im2col(A, [2 2], 'sliding')

这会正确地产生以下结果:

代码语言:javascript
复制
 0     0     3     1
 0     4     1     4
 3     1     0     2
 1     4     2     1

我称这个矩阵为K。现在,我使用col2im返回到我的原始矩阵。在Matlab文档中,我使用了以下内容:

代码语言:javascript
复制
col2im(K, [2 2], [5 5],'sliding')

但这并没有给出我的原始矩阵A。原因是[5 5]应该是[4 4],才能获得3*3的入门矩阵。但当我这么做的时候我会得到

代码语言:javascript
复制
??? Error using ==> reshape
To RESHAPE the number of elements must not change.

为什么会这样呢?我怎样才能找回我的原始矩阵呢?

EN

回答 3

Stack Overflow用户

发布于 2013-12-10 23:29:58

从文档中:

A= col2im(B,m n,mm nn,'sliding')将行向量B重新排列成一个大小为(mm-m+1)×(nn-n+1)的矩阵。B必须是大小为1*(mm-m+1)*(nn-n+1)的向量。B通常是使用列压缩函数(如sum)处理im2col(...,'sliding')输出的结果。

所以对我来说,你应该试着这样做:

代码语言:javascript
复制
col2im(sum(K), [2 2], [4 4],'sliding')

但是,这将要求K具有9列。我手头上没有图像处理工具箱来测试它

票数 0
EN

Stack Overflow用户

发布于 2013-12-11 01:41:21

你的col2im不能工作,因为它使用了reshape,因此你想要重塑的矩阵的元素数(K)和新的元素数需要相同。情况不再是这样了,因为通过使用im2col转换A,您显然改变了这一点。A有9个元素和K16个元素。

因此,您基本上需要通过删除K中的冗余元素和双倍元素(由于im2col中使用了重叠的2*2块)来再次返回到3*3矩阵。为此,您只需使用所需的元素创建一个新的矩阵(C):

代码语言:javascript
复制
C = [K([1,3,11;2,4,12;6,8,16])]

只要你首先使用相同的块顺序从3*3矩阵到4*4矩阵,这应该是可行的。

也许你可以告诉我们更多关于你真正想要实现的东西,因为我从一开始就看不到任何理由。使用其他函数也可能会更好,但我只能在知道您的问题背后的原因的情况下才能看到这一点。

票数 0
EN

Stack Overflow用户

发布于 2017-08-16 22:36:34

代码语言:javascript
复制
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 =

代码语言:javascript
复制
 6     2     2     7
 5     8     7     8
 1     4     3     5
 4     6     7     1

%矩阵大小

r=大小(Img)

面片大小百分比

W= 2;

要修补的图像百分比

imgBlock = im2col(img,w w,‘滑动’)

% image patchs矩阵到向量

imgBlock = imgBlock(:);

R=

代码语言:javascript
复制
 4

C=

代码语言:javascript
复制
 4

imgBlock =

代码语言:javascript
复制
 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=网格(1:C,1:R)

%索引矩阵到补丁;到向量

xx = im2col(x,w w,‘滑动’);xx = xx(:);

yy = im2col(y,w w,‘滑动’);yy = yy(:);

X=

代码语言:javascript
复制
 1     2     3     4
 1     2     3     4
 1     2     3     4
 1     2     3     4

Y=

代码语言:javascript
复制
 1     1     1     1
 2     2     2     2
 3     3     3     3
 4     4     4     4

% yy :行索引xx:列索引

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

均值=累加数组(yy xx,imgBlock,[],@ img2 );

img

img2

img =

代码语言:javascript
复制
 6     2     2     7
 5     8     7     8
 1     4     3     5
 4     6     7     1

img2 =

代码语言:javascript
复制
 6     2     2     7
 5     8     7     8
 1     4     3     5
 4     6     7     1

%列,行,值

A= xx,yy,imgBlock

A=

代码语言:javascript
复制
 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)在矩阵中出现的次数

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

ans =

代码语言:javascript
复制
 2     2     8
 2     2     8
 2     2     8
 2     2     8
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20498010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档