diff --git a/src/main/java/bdv/tools/InitializeViewerState.java b/src/main/java/bdv/tools/InitializeViewerState.java
index cb51ce10324d1b1ec166b4c48877e5427e9452e5..36aa6b2a4d7b2df0f62fb0c796f5a3c82f0a2662 100644
--- a/src/main/java/bdv/tools/InitializeViewerState.java
+++ b/src/main/java/bdv/tools/InitializeViewerState.java
@@ -93,8 +93,8 @@ public class InitializeViewerState
 	 */
 	public static AffineTransform3D initTransform( final int viewerWidth, final int viewerHeight, final boolean zoomedIn, final ViewerState state )
 	{
-		final int cX = viewerWidth / 2;
-		final int cY = viewerHeight / 2;
+		final double cX = viewerWidth / 2.0;
+		final double cY = viewerHeight / 2.0;
 
 		final Source< ? > source = state.getSources().get( state.getCurrentSource() ).getSpimSource();
 		final int timepoint = state.getCurrentTimepoint();
@@ -111,9 +111,9 @@ public class InitializeViewerState
 		final double sY1 = sourceInterval.max( 1 );
 		final double sZ0 = sourceInterval.min( 2 );
 		final double sZ1 = sourceInterval.max( 2 );
-		final double sX = ( sX0 + sX1 + 1 ) / 2;
-		final double sY = ( sY0 + sY1 + 1 ) / 2;
-		final double sZ = ( sZ0 + sZ1 + 1 ) / 2;
+		final double sX = ( sX0 + sX1 ) / 2;
+		final double sY = ( sY0 + sY1 ) / 2;
+		final double sZ = Math.round( ( sZ0 + sZ1 ) / 2 ); // z-slice in the middle of a pixel
 
 		final double[][] m = new double[ 3 ][ 4 ];
 
@@ -152,8 +152,8 @@ public class InitializeViewerState
 		viewerTransform.scale( scale );
 
 		// window center offset
-		viewerTransform.set( viewerTransform.get( 0, 3 ) + cX, 0, 3 );
-		viewerTransform.set( viewerTransform.get( 1, 3 ) + cY, 1, 3 );
+		viewerTransform.set( viewerTransform.get( 0, 3 ) + cX - 0.5, 0, 3 );
+		viewerTransform.set( viewerTransform.get( 1, 3 ) + cY - 0.5, 1, 3 );
 		return viewerTransform;
 	}