用python计算图像的径向平均值的最佳方法是什么? [英] What is the best way to calculate radial average of the image with python?
问题描述
我有一个正方形的图像,例如这个图像:
I have a square image, for example this one:
,我想从位置(0,0)计算出每个半径的图像的一维平均值.我已经编写了一些代码来执行此操作,但是首先,即使是小图像,它也非常慢,其次,我发现其背后的思想也存在一些问题.代码在这里:
and I would like to calculate the 1D average of the image for each radius from the position (0,0). I have written some code to do so, but first of all it very slow even for small images, secondly I see that there are also some problems with the idea behind it. Code is here:
import matplotlib.pyplot as plt
import numpy as np
import collections
from skimage import data
image = data.coins()
image = image[:,0:303]
print(image.shape)
projection = {}
total_count = {}
for x_i,x in enumerate(image):
for y_i,y in enumerate(x):
if round(np.sqrt(x_i**2+y_i**2),1) not in projection:
projection[round(np.sqrt(x_i**2+y_i**2),1)] = y
total_count[round(np.sqrt(x_i**2+y_i**2),1)] = 1
elif np.sqrt(round(np.sqrt(x_i**2+y_i**2),1)) in projection:
projection[round(np.sqrt(x_i**2+y_i**2),1)] += y
total_count[round(np.sqrt(x_i ** 2 + y_i ** 2), 1)] += 1
od = collections.OrderedDict(sorted(projection.items()))
x, y = [],[]
for k, v in od.items():
x.append(k)
y.append(v/total_count[k])
plt.plot(x,y)
plt.xlabel('Radius from (0,0)')
plt.ylabel('Averaged pixel value')
plt.show()
代码结果如下:
有人知道如何改进我的脚本吗?我也不知道为什么在某些情况下会有一些峰值很小的峰值.我真的很感谢一些提示.谢谢!
Has anyone have some clue how to improve my the script? I also don't know why in some cases there are some spikes which have very small average value. I would really appreciate some hints. Thanks!
推荐答案
您可以通过创建半径R
的矩阵按半径过滤图像
并计算
You may filter the image by the radius by creating a matrix of radii R
and calculating
image[(R >= r-.5) & (R < r+.5)].mean()
其中r
是您感兴趣的半径.
where r
is the radius you are interested in.
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
# get some image
image = data.coins()
image = image[:,0:303]
# create array of radii
x,y = np.meshgrid(np.arange(image.shape[1]),np.arange(image.shape[0]))
R = np.sqrt(x**2+y**2)
# calculate the mean
f = lambda r : image[(R >= r-.5) & (R < r+.5)].mean()
r = np.linspace(1,302,num=302)
mean = np.vectorize(f)(r)
# plot it
fig,ax=plt.subplots()
ax.plot(r,mean)
plt.show()
这篇关于用python计算图像的径向平均值的最佳方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!