要在matlab中使用滑动窗口阻止的列

时间:2011-04-19 07:22:11

标签: matlab

在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,[]);

提前感谢...

3 个答案:

答案 0 :(得分:3)

您没有指定完全问题是什么,但我看到了一些潜在的来源:

  1. 您不应期望输出与输入完全相同,因为您将每个像素值替换为8×8邻域中的像素总和。此外,由于IM2COL[m-1 n-1]选项不会用零填充数组以创建邻域,因此每个方向上的结果图像会缩小7个像素(即'sliding')。边缘附近的像素。

  2. 这两行是多余的:

    i2 = reshape( sum(i1),mm-m+1,nn-n+1);
    out=col2im(i2,[m n],[mm nn],'sliding');
    

    你只需要一个或另一个,而不是两者:

    %# Use this:
    out = reshape(sum(i1),mm-m+1,nn-n+1);
    %# OR this:
    out = col2im(sum(i1),[m n],[mm nn],'sliding');
    
  3. Image data in MATLAB 典型地类型为'uint8',意味着每个像素都表示为无符号的8位整数,范围为0到255.假设这是in是什么,当你执行求和操作时,你将隐式地将它转换为'double'类型(因为无符号的8位整数可能不足以保持总和)。当图像像素值用双精度表示时,像素值应该跨越0到1的范围,因此您需要将结果图像按其最大值进行缩放以使其正确显示:

    out = out./max(out(:));
    
  4. 最后,检查您正在使用的输入图像类型。对于您的代码,您基本上假设in是2-D(即grayscale intensity image)。如果它是truecolor (i.e. RGB) image,则第三个维度会给您带来麻烦,您必须分别处理每个颜色平面并重新组合它们或convert the RGB image to grayscale。如果它是indexed image(带有关联的颜色映射),则在未事先将其转换为grayscale representation的情况下,您将无法进行上述处理。

答案 1 :(得分:0)

为什么期望输出相同?

i2是在像素邻域(本质上是低通滤波器)周围执行SUM的结果,这是您看到的最终模糊图像。即你没有使用COL2IM呼叫进行逆过程。

答案 2 :(得分:0)

i1选项中获取的

'sliding'具有您从'distinct'选项中获取的信息,您需要将其过滤掉。现在,这可能不是编码的最佳方式,但它可行。假设mmm的倍数,nnn的倍数。如果不是这种情况,那么你必须相应地进行零填充以实现这种情况。

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');