图像

有没有一种简单的方法可以使用 NumPy/Scipy 计算图像上的运行方差过滤器? 通过运行方差图像,我的意思是计算图像中每个子窗口 I 的 sum((I -mean(I))^2)/ 的结果。

由于图像非常大(像素),我想避免在格式之间转换数组的开销,以便能够使用不同的库,然后再转换回来。

我想我可以通过使用类似的东西来做到这一点

手动查找平均值的方法

= np.ones((, ))/**2

= scipy..(图像,)

差异 = (图像 – )**2

# 总和 * 子-

#

但如果有类似函数的东西会更好。

任何人都可以向我指出具有此功能并支持 numpy 数组的库的方向,或者建议/提供一种在 NumPy/SciPy 中执行此操作的方法吗?

更简单的解决方案也更快:使用 SciPy\'s .

numpy 作为 np

来自 scipy

行、列 = 500, 500

, = 5, 5

img = np..rand(行,列)

= .(img, (, ))

= .(img**2, (, ))

= -**2

“跨步技巧”是一个漂亮的技巧,但 4 速度较慢且可读性较差。

比步幅慢20倍…

您可以使用 numpy.lib.. 获取图像的窗口视图:

10

11

numpy 作为 np

来自 numpy.lib。

行、列 = 500, 500

, = 5, 5

img = np..rand(行,列)

= (img, 形状=(行-+1, 列-+1,

, ),

=图片。*2)

现在 [i, j] 是一个 (, ) 数组,左上角位于 [i, j] 位置:

10

11

12

>>>img[100:105, 100:105]

数组([[ 0., 0., 0., 0., 0.],

[ 0., 0., 0., 0., 0.],

[ 0., 0., 0., 0., 0.],

[ 0., 0., 0., 0., 0.],

[ 0., 0., 0., 0., 0.]])

>>> [100,100]

数组([[ 0., 0., 0., 0., 0.],

[ 0., 0., 0., 0., 0.],

[ 0., 0., 0., 0., 0.],

[ 0., 0., 0., 0., 0.],

[ 0., 0., 0., 0., 0.]])

但是,您必须小心,不要将图像的窗口视图转换为其窗口副本:在我的示例中,这将需要 25 倍的存储空间。 我相信 numpy 1.7 可以让你选择多个轴,所以你可以简单地执行以下操作:

>>> np.var(, axis=(-1, -2))

我被 numpy 1.6.2 困住了,所以我无法测试它。 如果我没记错我的数学,另一种选择可能会在窗口不太大的情况下失败:

>>> = np.sum(np.sum(, 轴=-1), 轴=-1)//

>>> = np.sum(np.sum(**2, axis=-1), axis=-1)//

>>> = – **2

现在是一个形状数组

>>>.形状

(496, 496)

[i, j] 保存 (5, 5) 窗口的方差,左上角为 [i, j]。

经过一些优化,我们提出了一个通用 3D 图像的函数:

10

11

12

13

14

15

16

17 号

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

定义(img,):

来自 numpy.lib。

=(2*)+1

如果~%2==1:

print',必须是奇数'

# hack — 这可能是一个输入,但很懒

= [ , , ]

# 检查是否有3D图像输入。

if len( img.shape ) != 3:

print"\t : 你确定你给我的是 3D 图像吗?"

-1

别的:

DIMS = 图片。 形状

# 设置数据视图…这将有一个

= (img, 形状=(DIMS[0]-[0]+1, DIMS[1]-[1]+1, DIMS[2]-[2]+1, [0], [1], [2 ] ), =img.*2)

#,

= 麻木。 sum(numpy.sum(numpy.sum(, axis=-1), axis=-1), axis=-1) / ([0]*[1]*[2])

# 根据,我们是每个的平均值,

# 然后.

# 到 64 位 float ,(至少对于我们来说)变大

= numpy.sum(numpy.sum(numpy.sum((( .T.(') – .T.(') )**2).T, 轴=-1), 轴=-1), 轴= -1) / ([0]*[1]*[2])

# 尺寸合适的图像,以便与视图调用

= numpy.zeros(DIMS, dtype=' )

# 复制出来…

[ [0]/2:DIMS[0]-[0]+1+[0]/2,[1]/2:DIMS[1]-[1]+1+[1]/2,[2] /2:DIMS[2]-[2]+1+[2]/2, ] =

#

.('>f4')

你可以使用 scipy…我无法使用 进行测试,但也许这会给你你想要的:

numpy 作为 np

scipy.as

subs = 10 # 这是 () sub- 的大小

img = np..rand(500, 500)

= ..(img, np.std, 大小=subs)

您可以使用关键字创建任意大小的子窗口。 请参阅此问题的示例。

好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注