Skip to content

Convenience methods for signed distance transform #72

Open
@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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions