我使用matlab中的im2col滑动窗口将输入图像块转换为列,然后使用col2im进行反向转换,但输出的图像与输入图像不同。如何恢复输入图像?有谁能帮帮我。
以下是代码
in=imread('tire.tif');
[mm nn]=size(in);
m=8;n=8;
figure,imshow(in);
i1=im2col(in,[8 8],'sliding');
i2 = reshape( sum(i1),mm-m+1,nn-n+1);
out=col2im(i2,[m n],[mm nn],'sliding');
figure,imshow(out,[]);先谢谢你...
发布于 2011-04-19 22:15:49
您没有具体说明问题是什么,但我看到了一些潜在的来源:
'sliding'选项不会用零填充数组来为边缘附近的像素创建邻域,因此结果图像在每个方向(即[m-1 n-1])上将收缩7个像素。i2 = reshape( sum(i1),mm-m+1,nn-n+1);out=col2im(i2,m n,mm nn,‘滑动’);
您只需要其中之一,而不是两个都需要:
%#使用这个: out = reshape(sum(i1),mm-m+1,nn-n+1);%# OR this: out = col2im(sum(i1),m n,mm nn ),'sliding');
'uint8'类型,这意味着每个像素都表示为一个范围从0到255的无符号8位整数。假设这就是in,当您执行sum操作时,您将隐式地将其转换为'double'类型(因为一个无符号的8位整数可能不足以容纳总和)。当图像像素值使用double类型表示时,像素值的范围应在0到1之间,因此您需要按最大值缩放生成的图像,以使其正确显示:out = out./max(out(:));
in是2-D (即grayscale intensity image)。如果它是一个truecolor (i.e. RGB) image,第三个维度将会给你带来一些麻烦,你将不得不单独处理每个颜色平面并将它们重新组合,或者convert the RGB image to grayscale。如果它是一个具有关联色彩映射表的indexed image,那么如果不首先将其转换为一个grayscale representation.,您将无法进行上述处理
发布于 2011-04-19 21:57:24
为什么您期望输出是相同的?
i2是围绕像素邻域(本质上是低通滤波器)执行求和的结果,它是您看到的最终模糊图像。也就是说,您不是在对COL2IM调用执行相反的过程。
发布于 2015-04-08 15:35:19
从'sliding'选项获得的i1也包含从'distinct'选项获得的信息,您需要过滤掉这些信息。现在,这可能不是最好的编码方式,但它是有效的。假设mm是m的倍数,nn是n的倍数。如果不是这样,那么您将不得不相应地进行零位填充才能使其成为这种情况。
in=imread('tire.tif');
[mm nn]=size(in);
m=8;n=8;
i1 = im2col(in,[m,n],'sliding');
inSel = [];
for k=0:mm/m-1
inSel = [inSel 1:n:nn+(nn-n+1)*n*k];
end
out = col2im(i1(:,inSel),[m,n],[mm,nn],'distinct');https://stackoverflow.com/questions/5712922
复制相似问题