我想添加一个边界到一个不规则的三维图像,这是一个二进制数字数组存储。我想也许可以将图像的体素左/右、前/后、上/下移动,然后组合这6个图像并减去原始图像;使用以下代码:
#make copy of the image shifted one voxel to the left
image_border = np.zeros((img_dim[0], img_dim[1], img_dim[2]))
for x in xvoxels:
x_slice_original = image[x, :, :]
x_slice_new = np.zeros((img_dim[1], img_dim[2]))
for y in yvoxels:
for z in zvoxels:
if x_slice_original[y, z] == 1:
x_slice_new[(y-1), z] = 1
else:
x_slice_new[(y-1), z] = 0
image_border[x, :, :] = x_slice_new
有人想知道有没有更有效的解决方案?在
编辑: 该图像为91*109*91体素的MRI图像。xvoxels和zvoxels是列表0:90,yvoxels是列表0:108
这里有一个使用
scipy.ndimage.binary_dilation
的非常简单的方法,它本质上是您想要的操作的库版本。剩下要做的就是把原始体素清空。正如你所看到的,整件事在一条线上很舒服。在你要做的是一个叫做“扩张”的过程。对于二值图像,其思想是循环遍历图像中的所有像素。如果像素为'True',则使其周围的指定像素集也为'True'(由'kernel'或'structure'定义)。例如
有核的
^{pr2}$当达到(2,2)时,它变为:
当达到(2,3)时,它变为:
您可以重复此操作,或者使用其他内核。例如:
结果是:
相关问题 更多 >
编程相关推荐