... определить стандартное отклонение в определенной области рентгеновского изображения с помощью Python / Numpy / SKimage.
Давайте сначала сгенерируем фиктивное изображение:
In [18]: import numpy as np
In [19]: rows, cols = 4, 4
In [20]: image = np.linspace(0, 1, rows*cols).reshape(rows, cols)
In [21]: np.set_printoptions(precision=2)
In [22]: image
Out[22]:
array([[0. , 0.07, 0.13, 0.2 ],
[0.27, 0.33, 0.4 , 0.47],
[0.53, 0.6 , 0.67, 0.73],
[0.8 , 0.87, 0.93, 1. ]])
И давайте определим интересующую область с помощью двойного порога:
In [25]: low, high = .3, .6
In [26]: mask = np.logical_and(image > low, image < high)
In [27]: mask
Out[27]:
array([[False, False, False, False],
[False, True, True, True],
[ True, False, False, False],
[False, False, False, False]])
Булево индексирование - это возможный способ вычисления стандартного отклонения по интересующей области:
In [29]: image[mask]
Out[29]: array([0.33, 0.4 , 0.47, 0.53])
In [30]: np.std(image[mask])
Out[30]: 0.07453559924999299
Установка нежелательных пикселей на np.nan
и использование NumPy's nanstd
для вычисления стандартного отклонения - это еще один способ:
In [32]: test1 = np.where(mask, image, np.nan)
In [33]: test1
Out[33]:
array([[ nan, nan, nan, nan],
[ nan, 0.33, 0.4 , 0.47],
[0.53, nan, nan, nan],
[ nan, nan, nan, nan]])
In [34]: np.nanstd(test1)
Out[34]: 0.07453559924999299
... проблема реализации шумов на сегментах изображения.
Вы можете использовать scikit-images random_noise
, чтобы создать зашумленное изображение, а затем отфильтровать эти пиксели за пределами интересующей области через NumPy's where
:
In [36]: from skimage.util import random_noise
In [37]: noisy = random_noise(image)
In [38]: noisy
Out[38]:
array([[0.14, 0.07, 0.17, 0.29],
[0.34, 0.39, 0.38, 0.53],
[0.66, 0.73, 0.66, 0.67],
[0.73, 0.98, 1. , 0.88]])
In [39]: np.where(mask, noisy, image)
Out[39]:
array([[0. , 0.07, 0.13, 0.2 ],
[0.27, 0.39, 0.38, 0.53],
[0.66, 0.6 , 0.67, 0.73],
[0.8 , 0.87, 0.93, 1. ]])