Стандартное отклонение значений пикселей в замаскированном изображении

У меня есть изображение 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, а белый кружок почти однороден.

Есть идеи, как убедиться, что я получаю стандартное отклонение значений пикселей внутри белого круга ТОЛЬКО питоническим способом?


person Foodaaaay    schedule 24.01.2014    source источник


Ответы (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])
person jwg    schedule 24.01.2014
comment
jwg, я очень ценю комментарий! Я согласен, что большое значение из-за нулей. Однако я хочу, чтобы все было нормально, если внутри круга тоже были нули. Я все же пробовал вы первую строчку кода, но получаю синтаксическую ошибку? Когда я использую вашу вторую строку кода, я получаю st. разработчик значение ноль, но это потому, что я не «перевернул условие», не могли бы вы объяснить, что вы имеете в виду под этим? Спасибо еще раз! - person Foodaaaay; 24.01.2014
comment
Первая строка Python была полностью искажена, в последнее время я работаю с другими языками. - person jwg; 24.01.2014
comment
вы сделали мои выходные jwg :) - person Foodaaaay; 24.01.2014