Skip to content

Convenience methods for signed distance transform #72

@hanslovsky

Description

@hanslovsky

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions