【问题标题】:Moving Pixel Statistics in an Image [duplicate]图像中的移动像素统计[重复]
【发布时间】:2017-04-03 02:15:13
【问题描述】:

我想使用大小为3x3 像素的滑动窗口以逐像素方式迭代图像,并且在滑动窗口的每个位置我想计算最小值最大值均值标准差

你能告诉我如何做到这一点吗?另外,执行此操作的最快方法是什么?

非常感谢!

【问题讨论】:

  • 请展示您已经尝试过的内容,包括您考虑使用的函数、您考虑采用的方法、其他语言的实现等。如果对 MATLAB 文档有任何不清楚的地方 - 您应该提及这一点。如果您遇到一些错误 - 您应该提到这一点。如果您担心性能问题 - 您应该询问这个问题(即“我做了 X,您能提出更有效的方法吗?”)。自己努力解决自己的问题会鼓励其他人回答。祝你好运!

标签: image matlab image-processing filtering sliding-window


【解决方案1】:

您应该尽可能使用内置函数。

nlfilter 推荐用于滑动窗口操作。 colfilt 相同,但通常具有更好的内存局部性,您应该使用它。

neigh = [3,3];

I_mean = colfilt(I, neigh, 'sliding', @mean);
I_max = colfilt(I, neigh, 'sliding', @max);
I_min = colfilt(I, neigh, 'sliding', @min);

可以使用stdfilt 计算标准偏差。 colfilt(... @std) 出于某种原因需要进行数据类型转换,并且在我的机器上慢了约 4 倍。

I_std = stdfilt(I); 

返回使用 3x3 滑动窗口制作的标准差图像。

如果公平比较是指比较速度,请注意colfiltstdfilt 完全不同。

I_std = colfilt(double(I), neigh, 'sliding', @std);

您还可以通过imfilter 计算平均图像。快了一个数量级,但是边框像素输出有点不一样

tic;
meanh = fspecial('average', neigh);
I_mean = imfilter(I, meanh);
toc

Elapsed time is 0.024311 seconds.

对比

tic;
I_mean2 = colfilt(I, neigh, 'sliding', @mean);
toc

Elapsed time is 0.649545 seconds.

这是差异的说明 (double(I_mean)-double(I_mean2))。只有边框像素不同:

邻域越大,速度差异越大。

【讨论】:

  • 非常感谢您的帮助。事实上,时间复杂度是我想要衡量的。我的原始代码是用 Java 编写的,它只扫描一次图像。在扫描期间,计算滑动窗口当前位置的四个值,即 min、max、mean 和 stdev,并在继续到下一个位置之前将其输入到函数中。在您的代码中,我认为会生成四个图像(矩阵),然后我需要重新扫描这些图像才能对窗口的每个位置进行操作。关于如何模仿我的 java 程序的任何想法?感谢您的支持。
  • 对不起,我不明白你想要达到什么目的。 Matlab 完全是关于矢量化代码和调用高度优化的例程。如果您使用 for 循环实现某些东西并尝试将速度与 Java 中的类似例程进行比较,那么它会将苹果与橙子进行比较。如果您担心的是等待计算图像的功能,我可以保证这种方式更快。之后您可以循环遍历图像。或者更好的是,将它们提供给矢量化函数。
猜你喜欢
  • 2018-07-23
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多