Image 图像中的运动像素统计信息
我希望使用大小为Image 图像中的运动像素统计信息,image,matlab,image-processing,filtering,sliding-window,Image,Matlab,Image Processing,Filtering,Sliding Window,我希望使用大小为3x3像素的滑动窗口以逐像素的方式迭代图像,并且在滑动窗口的每个位置,我希望计算像素值的最小值,最大值,平均值,以及标准偏差 你能告诉我如何做到这一点吗?另外,执行此操作的最快方法是什么 非常感谢 如果可能,您应该始终使用内置函数 建议用于滑动窗口操作。是相同的,但通常具有更好的内存局部性,您应该使用它 neigh = [3,3]; I_mean = colfilt(I, neigh, 'sliding', @mean); I_max = colfilt(I, neigh, '
3x3
像素的滑动窗口以逐像素的方式迭代图像,并且在滑动窗口的每个位置,我希望计算像素值的最小值,最大值,平均值,以及标准偏差
你能告诉我如何做到这一点吗?另外,执行此操作的最快方法是什么
非常感谢 如果可能,您应该始终使用内置函数 建议用于滑动窗口操作。是相同的,但通常具有更好的内存局部性,您应该使用它
neigh = [3,3];
I_mean = colfilt(I, neigh, 'sliding', @mean);
I_max = colfilt(I, neigh, 'sliding', @max);
I_min = colfilt(I, neigh, 'sliding', @min);
标准偏差可使用以下公式计算:colfilt(…@std)
出于某种原因需要进行数据类型转换,在我的机器上速度慢了约4倍
I_std = stdfilt(I);
返回使用3x3滑动窗口生成的标准偏差图像
如果公平比较是指比较速度,请注意colfilt
和stdfilt
是完全不同的
I_std = colfilt(double(I), neigh, 'sliding', @std);
您还可以通过计算平均图像。它的速度快了一个数量级,但边界像素输出有点不同
tic;
meanh = fspecial('average', neigh);
I_mean = imfilter(I, meanh);
toc
Elapsed time is 0.024311 seconds.
vs
下面是差异的一个例子(double(我的意思是)-double(我的意思是2)
)。只有边框像素不同:
邻近区域越大,速度差越大。如果可能,应始终使用内置函数 建议用于滑动窗口操作。是相同的,但通常具有更好的内存局部性,您应该使用它
neigh = [3,3];
I_mean = colfilt(I, neigh, 'sliding', @mean);
I_max = colfilt(I, neigh, 'sliding', @max);
I_min = colfilt(I, neigh, 'sliding', @min);
标准偏差可使用以下公式计算:colfilt(…@std)
出于某种原因需要进行数据类型转换,在我的机器上速度慢了约4倍
I_std = stdfilt(I);
返回使用3x3滑动窗口生成的标准偏差图像
如果公平比较是指比较速度,请注意colfilt
和stdfilt
是完全不同的
I_std = colfilt(double(I), neigh, 'sliding', @std);
您还可以通过计算平均图像。它的速度快了一个数量级,但边界像素输出有点不同
tic;
meanh = fspecial('average', neigh);
I_mean = imfilter(I, meanh);
toc
Elapsed time is 0.024311 seconds.
vs
下面是差异的一个例子(double(我的意思是)-double(我的意思是2)
)。只有边框像素不同:
附近地区越大,速度差就越大。非常感谢您的帮助。事实上,时间复杂性正是我想要衡量的。我的原始代码是Java,它只扫描图像一次。在扫描过程中,计算滑动窗口当前位置的四个值,即min、max、mean和stdev,并将其输入到函数中,然后再进入下一个位置。在您的代码中,我认为将生成四个图像(矩阵),然后我需要重新扫描这些图像,以便对窗口的每个位置进行操作。你知道如何模仿我的java过程吗?非常感谢你的hep。对不起,我不明白你想达到什么目的。Matlab是关于矢量化代码和调用高度优化的例程的。如果您使用for循环实现某些东西,并尝试将其速度与Java中的类似例程进行比较,那就是将苹果与橙子进行比较。如果是你的函数在等待图像被计算,你会担心,我可以保证这种方法会更快。之后,您可以在图像上循环。或者更好,将它们输入到矢量化函数。非常感谢您的帮助。事实上,时间复杂性正是我想要衡量的。我的原始代码是Java,它只扫描图像一次。在扫描过程中,计算滑动窗口当前位置的四个值,即min、max、mean和stdev,并将其输入到函数中,然后再进入下一个位置。在您的代码中,我认为将生成四个图像(矩阵),然后我需要重新扫描这些图像,以便对窗口的每个位置进行操作。你知道如何模仿我的java过程吗?非常感谢你的hep。对不起,我不明白你想达到什么目的。Matlab是关于矢量化代码和调用高度优化的例程的。如果您使用for循环实现某些东西,并尝试将其速度与Java中的类似例程进行比较,那就是将苹果与橙子进行比较。如果是你的函数在等待图像被计算,你会担心,我可以保证这种方法会更快。之后,您可以在图像上循环。或者更好的是,将它们提供给一个矢量化函数。请展示您已经尝试过的内容,包括您考虑使用的函数、您考虑采用的方法、其他语言的实现等。如果MATLAB文档中有不清楚的地方,您应该提一下。如果你遇到了一些错误,你应该提到这一点。如果您担心性能问题,您应该询问(例如,“我做了X,您能建议一种更有效的方法吗?”)。自己努力解决自己的问题会鼓励别人回答。祝你好运请展示您已经尝试过的内容,包括您考虑使用的函数、您考虑采用的方法、其他语言的实现等。如果MATLAB文档中有不清楚的地方,您应该提及。如果你遇到了一些错误,你应该提到这一点。如果您担心性能问题,您应该询问(例如,“我做了X,您能建议一种更有效的方法吗?”)。自己努力解决自己的问题会鼓励别人回答。祝你好运