【发布时间】:2020-07-07 11:05:57
【问题描述】:
我的目标是取 200 多张图像的平均值,然后找到所述平均值的标准差。向用户询问阈值,然后将阈值与标准偏差进行比较。如果阈值小于该特定像素的标准偏差,请将其更改为红色 [255,0,0]。我的问题在于采用像素的标准偏差。任何帮助将不胜感激。
allimg = []
avg_img=[]
path = glob.glob('podatlamar/*.jpg')
for x in path:
img = Image.open(x)
img = np.float32(img)
allimg.append(img)
avg_img = np.average(allimg, axis=0)
std = [0,0,0]
for img in allimg :
std += (img-avg_img) ** 2
std = np.sqrt(std / (len(allimg) - 1))
现在:
for i in range(0, len(std)): #i is row
for j in range(0, len(std[i])): #j is column
if(std[i][j] > float(threshold)).any :
avg_img[i][j] = [255.0, 0.0, 0.0]
avg_img = np.clip(avg_img, 0, 255)
等等……
这里是正在运行的 for 循环调试
[avg_img 改成255,0,0
std 长什么样的片段
[[0.19792126 0.05137325 0.03966657]
[0.09997863 0.06348856 0.07472634]
[0.0367469 0.18667144 0.21834356]
...
[0.02421235 0.02454335 0.14083997]
[0.02319027 0.02351524 0.13969136]
[0.02285284 0.02317629 0.13930877]]
[[0.03304812 0.06428259 0.04262938]
[0.0978733 0.02841616 0.04049174]
[0.09566899 0.02877731 0.0357872 ]
...
[0.08500231 0.03502595 0.12032651]
[0.08347222 0.03630779 0.1217759 ]
[0.08385488 0.03598539 0.12141356]]
【问题讨论】:
-
我不清楚你想在这里做什么。您似乎在每个像素位置取 200 个样本的平均值,因此有效地通过 200 个图像的 z 轴,但您在平均图像的 x、y 维度上取标准偏差。那是对的吗?无论如何,您真的不想一次在内存中保存 200 张图像,因为图像很大。您只需要一个 float64 或 int64 图像,将所有 200 个输入图像相加并在最后除以 200。
-
你的最终计算应该用 Numpy 向量化,否则你会整天都在那里。尽量避免使用 Python 图像处理出现
for循环。 -
.any也让我担心,因为它让我想知道您是否有 RGB 图像而不是灰度图像? -
@MarkSetchell jpg 图像是 RGB 而非灰度。
-
目前,您通过将 uint8 字节转换为 float64 使每个图像都比需要的大 8 倍,并且您在内存中存储了 200 个这样的图像在一个列表中,因此您浪费了 1,600 倍的 RAM必要的。我们可以先解决这个问题吗?