2011-04-19 70 views
0

使用在Matlab im2col滑动窗口我已转换的输入图像块分割成柱,并再次通过使用col2im i执行逆过程,但输出不与输入相同的图像。我怎样才能恢复输入图像?谁能帮帮我吗。柱阻止使用滑动窗在MATLAB

下面是代码

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

在此先感谢...

回答

0

为什么你期待的输出是一样的吗?

i2是围绕像素邻域(本质上是低通滤波器)执行SUM的结果,它是您看到的最终模糊图像。即你不用COL2IM调用进行逆向处理。

3

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

  1. 你不应该指望输出为正好一样的输入,因为您要用8乘8邻域中的像素总和替换每个像素值。此外,由于IM2COL'sliding'选项不会为数组填充边缘附近像素的邻域,所以在每个方向上(即[m-1 n-1])会使得到的图像缩小7像素。

  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'型的,这意味着每个像素是表示为跨越范围0到255的无符号8位整数。假设这是in,当您执行求和操作时,您将最后将其转换为'double'(因为无符号的8位整数可能不足以保存总和)。当图像像素值用双重类型表示时,像素值预计会跨越0到1的范围,因此您需要按照其最大值缩放结果图像以使其正确显示:

    out = out./max(out(:)); 
    
  4. 最后,检查您正在使用什么样的输入图像。对于您的代码,基本上假定in是二维(即grayscale intensity image)。如果它是truecolor (i.e. RGB) image,第三个维度会给您带来一些麻烦,您将不得不分别处理每个色彩平面并重新组合它们或convert the RGB image to grayscale。如果它是一个indexed image(带有关联的彩色地图),则无需先将其转换为grayscale representation即可进行上述处理。

+0

感谢您的回应。问题是将图像矩阵转换为块后输出图像与输入图像相同,反之亦然。使用滑动窗口将输入图像(灰度强度图像)转换成尺寸为8×8的块,然后完成反向处理。通过在独特的窗口技术中使用IM2COL&COL2IM,这是可能的。它可以在滑动窗口技术。 – user714696 2011-04-20 00:17:06

+0

@ user714696:正如我在答复的第一点中提到的那样,使用滑动块选项总会给你一个稍小的结果。原因是因为没有使用该技术的填充,并且使用填充是您可以将窗口中心放在边缘点上的唯一方法。因此,如果您想要得到与输入图像大小相同的结果图像,则需要使用不同的块选项。 – gnovice 2011-04-20 02:08:21

+0

@ user714696 - 您可以编辑问题以更好地反映您正在查找的内容。如果它的块处理,看看| blkproc |和| blockproc | (新版本)。 – 2011-04-20 13:05:29

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