我正在使用Matlab中的图像进行特征提取。
为此,我必须在nXn窗口上应用许多功能(例如找到每个3X3窗口的差异等。
除了在矩阵上循环并每次收集窗口元素之外,在Matlab中是否有一种简单有效的方法可以做到这一点?
对于某些功能,我已经能够找到一个等效的掩码,并使用filter2应用它们,但对于其他许多我似乎没有这样的奢侈品(一个很好的例子:3X3窗口的中位数)。
我想要的是喜欢 arrayfun,但适用于nXn窗口的东西,而不是单个元素。
谢谢,
Sundar
答案 0 :(得分:5)
如果您有图像处理工具箱,则可以使用 blkproc 使用自定义函数处理图像的 nxm 块。这是一个例子
function Ip = imageProcessed(II,blockSize)
% FUNCTION imageProcessed calculates average value of blocks of size nxm
% blocks
if nargin<2,
% default/example value for block size
blockSize = [3 4];
end
if size(II,3)>1,
% blkproc requires a grayscale image
% convert II to gray scale if it is RGB.
II=rgb2gray(II)
end
% Custom average function.
myAveFun = @(x) ones(size(x))*sum(x(:))/length(x(:));
% use blkproc to process image
Ip = blkproc(II,[blockSize(1), blockSize(2)],myAveFun);
end
注意:
从MATLAB 2009b的图像处理工具箱开始, blkproc 被分离并替换为 blockproc (参见R2099b部分here)。所以最后两行可以改为:
myAveFun = @(blkstrct) ones(size(blkstrct.data))*mean(blkstrct.data(:))
Ip = blockproc(II,blockSize,myAveFun);