2014-04-17 161 views
2

我需要在图像Z上创建一个32x32的滑动窗口。然后我需要检查图像上每个窗口的平均强度。在matlab图像上滑动窗口

我可以使用: n = [32,32] h = fspecial('average',n); 过滤器2(H,张图片)

N = 32; 
info = repmat(struct, ceil(size(Z, 1)/N), ceil(size(Z, 2)/N)); 
for row = 1:N:size(Z, 1)%loop through each pixel in the image matrix 
    for col = 1:N:size(Z, 2) 
    r = (row - 1)/N + 1; 
    c = (col - 1)/N + 1; 
    imgWindow = Z(row:min(end,row+N-1), col:min(end,col+N-1)); 
    average = mean(imgWindow(:)) %calculate the mean intensity of pixels within each window 
    end 
end 

然而,这仅创建12X30。任何人都可以发现我出错的地方吗?

+0

与'repmat'一起做的那个魔术字'struct'是什么?它可能无法解决手头的问题,但对此感到好奇。 – Divakar

+1

如果你输入'size(Z)',你会得到什么? – tashuhka

+0

如果您有图像处理工具箱,您可能需要使用它具有的现成滑动过滤器功能。 –

回答

2

您的图像是364x350,窗口大小是32x32。什么情况是这样的:

enter image description here

请注意,在最后一栏的窗口是32x30,最后一排的窗户是12x32中,最后一个窗口(右下)是12X30。这是最后一次计算的结果,以及代码停止运行时为什么你会得到这个值。

我看到三个选项的位置:

  1. 像素和最后一排有20行像素的两列填补最后柱(填充零,也许)
  2. 放弃最后一列和最后一行。
  3. 改变窗口大小来MxN个,其中M是364的除数,而N是350。
+0

我认为前两个选项之一是最好的,因为我将在不同尺寸的不同图像上使用此代码。但是,如果我使用这两个选项中的一个,会不会影响窗口的平均亮度值? – user1853871

+0

在选项一上,是的。你不能使用那些不是32x32的窗口的平均强度吗? –

+0

是的,你建议使用哪个选项? – user1853871

1

初始化前的for循环的除数

e=1;

,然后开始在计数器for循环,并把这个代码

imgWindow (:,:,e)= Z(row:min(end,row+N-1), col:min(end,col+N-1)); 

,而不是

imgWindow = Z(row:min(end,row+N-1), col:min(end,col+N-1)); 

希望它能帮助你。 Regards