Open
Description
With the newly introduced binary distance transform methods (#69, #71), we can now very easily create a signed distance transform (beware: Kotlin!):
private fun <B: BooleanType<B>, T: RealType<T>> signedDistanceTransform(
mask: RandomAccessibleInterval<B>,
distanceOutside: RandomAccessibleInterval<T>,
distanceInside: RandomAccessibleInterval<T>,
vararg weights: Double = doubleArrayOf(1.0),
distanceType: DistanceTransform.DISTANCE_TYPE = DistanceTransform.DISTANCE_TYPE.EUCLIDIAN
): RandomAccessibleInterval<T> {
DistanceTransform.binaryTransform(mask, distanceOutside, distanceType, *weights)
DistanceTransform.binaryTransform(not(mask), distanceInside, distanceType, *weights)
val paired= Views.interval(Views.pair(distanceOutside, distanceInside), mask)
return difference(paired)
}
with helper methods
fun <B: BooleanType<B>> not(mask: RandomAccessibleInterval<B>): RandomAccessibleInterval<B>
{
return Converters.convert(mask, { s,t -> t.set(!s.get()) }, Util.getTypeFromInterval(mask).createVariable())!!
}
fun<T: RealType<T>> difference(pairs: RandomAccessibleInterval<Pair<T, T>>): RandomAccessibleInterval<T> {
return Converters.convert(
pairs,
{ s,t -> t.set(s.a); t.sub(s.b) },
Util.getTypeFromInterval(pairs).a.createVariable())!!
}
This will be negative inside the object defined by mask
and positive everywhere else.