diff --git a/src/main/java/qupath/ext/align/gui/ImageAlignmentPane.java b/src/main/java/qupath/ext/align/gui/ImageAlignmentPane.java index 180e9a7..505609a 100644 --- a/src/main/java/qupath/ext/align/gui/ImageAlignmentPane.java +++ b/src/main/java/qupath/ext/align/gui/ImageAlignmentPane.java @@ -370,10 +370,9 @@ public ImageAlignmentPane(final QuPathGUI qupath) { Button btnReset = new Button("Reset"); btnReset.setOnAction(e -> { var overlay = getSelectedOverlay(); - var affine = overlay == null ? null : overlay.getAffine(); - if (affine == null) + if (overlay == null) return; - affine.setToIdentity(); + overlay.resetAffine(); }); Button btnInvert = new Button("Invert"); btnInvert.setOnAction(e -> { diff --git a/src/main/java/qupath/ext/align/gui/ImageServerOverlay.java b/src/main/java/qupath/ext/align/gui/ImageServerOverlay.java index c4ff3c3..d6e8929 100644 --- a/src/main/java/qupath/ext/align/gui/ImageServerOverlay.java +++ b/src/main/java/qupath/ext/align/gui/ImageServerOverlay.java @@ -26,6 +26,7 @@ import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; import java.awt.image.BufferedImage; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,6 +40,7 @@ import qupath.lib.gui.viewer.overlays.PathOverlay; import qupath.lib.images.ImageData; import qupath.lib.images.servers.ImageServer; +import qupath.lib.images.servers.PixelCalibration; import qupath.lib.regions.ImageRegion; /** @@ -60,6 +62,9 @@ public class ImageServerOverlay extends AbstractOverlay { private AffineTransform transform; private AffineTransform transformInverse; + + private PixelCalibration viewerImageCalibration; + private PixelCalibration overlayImageCalibration; /** * Constructor. @@ -84,6 +89,13 @@ public ImageServerOverlay(final QuPathViewer viewer, final ImageServer { updateTransform(); viewer.repaintEntireImage(); @@ -115,7 +127,27 @@ public void setRenderer(ImageRenderer renderer) { public Affine getAffine() { return affine; } - + + /** + * Reset the affine transform to its pixel-correct scaled identity + */ + public void resetAffine() { + // The scaling factors's defaults + double mxx = 1; + double myy = 1; + + if (this.affine == null) + return; + + // Calculate the affine 'a' and 'y' scaling factor parameters - Defaults to 1 and 1 if no pixel size micron available. + if (this.viewerImageCalibration.hasPixelSizeMicrons() && this.overlayImageCalibration.hasPixelSizeMicrons()) { + mxx = this.viewerImageCalibration.getPixelWidthMicrons() / overlayImageCalibration.getPixelWidthMicrons(); + myy = this.viewerImageCalibration.getPixelHeightMicrons() / overlayImageCalibration.getPixelHeightMicrons(); + } + + this.affine.setToTransform(mxx, 0, 0, 0, myy, 0); + } + private void updateTransform() { transform.setTransform( affine.getMxx(), @@ -159,4 +191,4 @@ public void paintOverlay(Graphics2D g2d, ImageRegion imageRegion, double downsam } -} \ No newline at end of file +}