Pythonic Syntactic Sugar
Image Basics Notebook 非常简单,与 ITK 的 C++ 接口非常接近。
Sugar非常棒,它能让你精力充沛,更快地完成任务!SimpleITK 也应用了大量Sugar来帮助更快地完成任务。
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rc("image", aspect="equal")
import SimpleITK as sitk
# Download data to work on
%run update_path_to_download_script
from downloaddata import fetch_data as fdata
让我们首先开发一种在笔记本中显示图像的便捷方法。
img = sitk.GaussianSource(size=[64] * 2)
plt.imshow(sitk.GetArrayViewFromImage(img))
img = sitk.GaborSource(size=[64] * 2, frequency=0.03)
plt.imshow(sitk.GetArrayViewFromImage(img))
def myshow(img):
nda = sitk.GetArrayViewFromImage(img)
plt.imshow(nda)
myshow(img)
多维切片索引
如果您熟悉 numpy、切片索引,那么这对于 SimpleITK 图像来说应该是小菜一碟。1-D 对象的 Python 标准切片接口:
Operation | Result |
d[i] | i-th item of d, starting index 0 |
d[i:j] | slice of d from i to j |
d[i:j:k] | slice of d from i to j with step k |
通过这种方便的语法,许多基本任务可以轻松完成。
img[24, 24]
0.048901304602622986
裁剪
myshow(img[16:48, :])
myshow(img[:, 16:-16])
myshow(img[:32, :32])
翻转
img_corner = img[:32, :32]
myshow(img_corner)
myshow(img_corner[::-1, :])
myshow(
sitk.Tile(
img_corner,
img_corner[::-1, ::],
img_corner[::, ::-1],
img_corner[::-1, ::-1],
[2, 2],
)
)
切片提取
可以从 3D 图像中提取 2D 图像。
img = sitk.GaborSource(size=[64] * 3, frequency=0.05)
# Why does this produce an error?
myshow(img)
myshow(img[:, :, 32])
myshow(img[16, :, :])
子采样
myshow(img[:, ::3, 32])
数学运算符
大多数 Python 数学运算符都经过重载,以调用 SimpleITK 过滤器,该过滤器会逐像素执行相同的操作。它们可以对两个图像或一个图像和一个标量进行操作。
如果使用两个图像,则两个图像必须具有相同的像素类型。输出图像类型通常相同。
由于这些运算符基本上调用 ITK 过滤器,而 ITK 过滤器仅使用原始 C++ 运算符,因此必须小心防止溢出,并除以零等。
Operators |
+ |
- |
* |
/ |
// |
** |
img = sitk.ReadImage(fdata("cthead1.png"))
img = sitk.Cast(img, sitk.sitkFloat32)
myshow(img)
img[150, 150]
timg = img**2
myshow(timg)
timg[150, 150]
除法运算符
所有三个 Python 除法运算符都已实现,分别是 __floordiv__
、__truediv__
和 __div__
。
true 除法的输出是双像素类型。
请参阅 PEP 238,了解 Python 在 Python 3 中更改除法运算符的原因。
按位逻辑运算符
运算符 |
& |
| |
^ |
~ |
img = sitk.ReadImage(fdata("cthead1.png"))
myshow(img)
比较运算符
运算符 |
> |
>= |
< |
<= |
== |
这些比较运算符遵循与 SimpleITK 对二值图像的重置相同的约定。它们的像素类型为“sitkUInt8”,值为 0 和 1。
img = sitk.ReadImage(fdata("cthead1.png"))
myshow(img)
让常见的琐碎任务变得真正琐碎
myshow(img > 90)
myshow(img > 150)
myshow((img > 90) + (img > 150))
蒙版
根据给定的蒙版设置图像中的值。
# Create a grid and use as mask
grid_image = sitk.GridSource(
outputPixelType=sitk.sitkUInt16,
size=img.GetSize(),
sigma=(0.1, 0.1),
gridSpacing=(20.0, 20.0),
)
# zero out the values in the original image that correspond to
# the grid lines in the grid_image
img[grid_image == 0] = 0
myshow(img)