n-d图像的弹性变形。

elasticdeform的Python项目详细描述


n维图像的弹性变形(python、scipy、numpy、tensorflow)

Documentation StatusBuild Status

该库实现了n维图像的弹性网格变形。

弹性变形方法在

该程序生成带有随机位移的粗位移网格 对于每个网格点。然后对该网格进行插值以计算 输入图像中的每个像素。然后使用 位移向量和样条插值。

除了正常的正向变形外,该包装还提供 可以通过变形反向传播梯度的函数。这使得 在卷积神经网络中,可以将变形作为一个层。 为了方便起见,在elasticdeform.tf中提供了tensorflow包装器。

安装

pip install elasticdeform
or
pip install git+https://github.com/gvtulder/elasticdeform

这个库需要python 3和numpy开发头。

示例

此基本示例使用随机3 x 3变形网格变形图像:

importnumpy,imageio,elasticdeformX=numpy.zeros((200,300))X[::10,::10]=1# apply deformation with a random 3 x 3 gridX_deformed=elasticdeform.deform_random_grid(X,sigma=25,points=3)imageio.imsave('test_X.png',X)imageio.imsave('test_X_deformed.png',X_deformed)

多个输入

如果有多个图像,例如一个图像和一个分割图像,则可以 通过提供输入列表同时使两者变形。您可以指定 每个输入的样条线顺序不同。

# apply deformation to inputs X and Y[X_deformed,Y_deformed]=elasticdeform.deform_random_grid([X,Y])# apply deformation to inputs X and Y,# with a different interpolation for each input[X_deformed,Y_deformed]=elasticdeform.deform_random_grid([X,Y],order=[3,0])

多通道图像

默认情况下,变形将应用于输入的每个维度。如果你 如果有多通道图像,可以使用axis参数指定哪些轴 应该变形了。每个通道将应用相同的变形。

例如,要使rgb图像在前两个维度上变形,请运行:

X_deformed=elasticdeform.deform_random_grid(X,axis=(0,1))

变形多个输入时,可以为每个输入提供一组轴:

X=numpy.random.rand(3,200,300)Y=numpy.random.rand(200,300)[X_deformed,Y_deformed]=elasticdeform.deform_random_grid([X,Y],axis=[(1,2),(0,1)])

裁剪

如果您打算从变形的图像中裁剪一个小片段,可以提供 变形函数的裁剪尺寸。然后它将只计算裁剪的 输出像素,同时仍基于完整图像计算变形网格 尺寸。这节省了计算时间。

X=numpy.random.rand(200,300)# define a crop regioncrop=(slice(50,150),slice(0,100))# generate a deformation griddisplacement=numpy.random.randn(2,3,3)*25# deform full imageX_deformed=elasticdeform.deform_grid(X,displacement)# compute only the cropped regionX_deformed_crop=elasticdeform.deform_grid(X,displacement,crop=crop)# the deformation is the samenumpy.testing.assert_equal(X_deformed[crop],X_deformed_crop)

梯度

deform_grid_gradient函数可用于反向传播 相对于输入的输出。使用 用于前进步骤的参数。

X=numpy.random.rand(200,300)# generate a deformation griddisplacement=numpy.random.randn(2,3,3)*25# perform forward deformationX_deformed=elasticdeform.deform_grid(X,displacement)# obtain the gradient w.r.t. X_deformed (e.g., with backpropagation)dX_deformed=numpy.random.randn(*X_deformed.shape)# compute the gradient w.r.t. XdX=elasticdeform.deform_grid_gradient(dX_deformed,displacement)

注意:梯度函数将假定输入的大小与 输出。如果在正向阶段使用crop参数,则有必要 在 X_shape参数。

Tensorflow包装器

elasticdeform.tf模块为tensorflow中的deform_grid提供包装。 函数使用tensorflow张量作为输入和输出,否则使用 相同的参数。

importnumpyimportelasticdeform.tfasetfdisplacement_val=numpy.random.randn(2,3,3)*5X_val=numpy.random.rand(200,300)dY_val=numpy.random.rand(200,300)# construct TensorFlow input and top gradientdisplacement=tf.Variable(displacement_val)X=tf.Variable(X_val)dY=tf.Variable(dY_val)# the deform_grid function is similar to the plain Python equivalent,# but it accepts and returns TensorFlow TensorsX_deformed=etf.deform_grid(X,displacement,order=3)# the gradient w.r.t. X can be computed in the normal TensorFlow manner[dX]=tf.gradients(X_deformed,X,dY)

许可证信息

这个库是由Gijs van TulderBiomedical Imaging Group Rotterdam, 荷兰鹿特丹伊拉斯谟公司

它的灵感来自一个类似的基于python的实现 Florian Calvet。 这种基于c的实现给出了相同的结果,但是速度更快,并且 梯度实现。

此c实现包括NI_GeometricTransform的修改版本 来自SciPy's ndimage library

此代码在BSD许可证下可用。有关详细信息,请参见LICENSE.txt

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
空字符串检查在java中未按预期工作   JavaSpringWebClient:自动计算主体的HMAC签名并将其作为头传递   foreach是否有一个Java等效的foreach循环和一个引用变量?   java如何在Eclipse中导入jar   使用特定第三方或java时lombok触发错误。*方法或构造函数   安卓 java将对象数组转换为int数组   java使一定百分比的JUnit测试通过   java Android:将Seekbar的一个值与另一个值进行比较   java将int数组(图像数据)写入文件的最佳方式是什么   java取代了系统。yml的构造函数内的getProperty   sqlite Java将公钥和私钥转换为字符串,然后再转换回字符串   安卓获取白色像素并将其保存到java opencv中的数组中   java为什么是ServerSocket。setSocketFactory静态?   Java数组似乎在不直接修改的情况下更改值