【问题标题】:Standard deviation of pixel values in a masked image蒙版图像中像素值的标准偏差
【发布时间】:2014-01-24 22:25:42
【问题描述】:

我有一个带遮罩的 DICOM 图像。它看起来像一个黑色背景,中间有一个白色圆圈(没有被蒙版覆盖和归零的区域)。

代码如下:

import numpy as np
import dicom
import pylab

ds = dicom.read_file("C:\Users\uccadmin\Desktop\James_Phantom_CT_Dec_16th\James Phantom   CT Dec 16th\Images\SEQ4Recon_3_34\IM-0268-0001.dcm")

lx, ly = ds.pixel_array.shape
X, Y = np.ogrid[0:lx, 0:ly]
mask = (X - lx/2)**2 + (Y - ly/2)**2 > lx*ly/8  # defining mask
ds.pixel_array[mask] = 0
print np.std(ds.pixel_array) # trying to get standard deviation

pylab.imshow(ds.pixel_array, cmap=pylab.cm.bone) # shows image with mask

我只想获取白色圆圈内的像素值的标准偏差,即排除圆圈外的黑色空间(蒙版)。

我不认为我用上面的代码得到的值是正确的,因为它是 ~500,而且白色圆圈几乎是同质的。

任何想法如何确保我仅以 Pythonic 方式获得白色圆圈内像素值的标准偏差?

【问题讨论】:

    标签: arrays pixel mask dicom roi


    【解决方案1】:

    我认为你得到一个大数字的原因是因为你的标准差包括所有零值。

    简单地忽略所有零值就足够了吗? (这没关系,前提是圆圈中没有或很少有像素的值为 0。)如果是这样

    np.std([x for x in ds.pixel_array if x > 0])
    

    应该可以解决问题。如果这还不够好,那么您可以将面具中的条件反转为

    mask = (X - lx/2)**2 + (Y - ly/2)**2 < lx*ly/8  # defining mask, < instead of >
    

    然后做

    mp.std(ds.pixel_array[mask])
    

    【讨论】:

    • jwg,非常感谢您的评论!我同意大值是因为零。但是,如果圆圈内也有零,我希望它没问题。我试过你是第一行代码,但我得到“语法错误”?当我使用你的第二行代码时,我得到了一个 st。开发。值为零,但这是因为我没有“反转条件”,你介意解释一下你的意思吗?再次感谢!
    • Python第一行完全乱码,最近一直在用其他语言。
    • 你让我的周末jwg :)
    最近更新 更多