Hello @Spiran,
I assume that the question here is a crosspost of the question on the imaris extensions issue tracker. Please don’t simultaneously cross-post, and using different aliases (apologies if this isn’t you, but the question is an exact repeat of the one here). It is hard to maintain a coherent conversation when it is happening concurrently on multiple channels, and yes, the microscopy pun is intended.
I will give a general answer that is relevant to the ITK/SimpleITK community here, but as this is more specific, we should continue the discussion via the imaris extensions issue tracker.
Generally speaking, a perfect, numerical precision level, registration will yield a correlation coefficient of 1, only if the relationship between the intensities is I_2 = aI_1+b. If this is close to this, we will get a high correlation but not 1. As long as the optimum corresponds to the correct transformation we don’t really care if it is 0.7 or 0.9 which is why the correlation coefficient after registration is somewhere between a qualitative and quantitative measure of registration (more towards qualitative).
Case in point, see the toy code below with perfect registration but nonlinear intensity relationship:
import SimpleITK as sitk
import numpy as np
# Create "nucleus" image
nucleus_image1 = sitk.GaussianSource(
outputPixelType=sitk.sitkFloat32,
size=[256, 256],
sigma=[32, 32],
mean=[128, 128],
scale=16.0,
)
# Same image, no spatial difference so perfect registration, just change
# the intensities to be I^3
nucleus_image2 = sitk.Pow(nucleus_image1,3)
sitk.Show(nucleus_image1, "image1")
sitk.Show(nucleus_image2, "image2")
print("correlation between all image combinations ([I1,I1],[I1,I2],[I2,I1],[I2,I2])):")
print(
np.corrcoef(
[
sitk.GetArrayViewFromImage(nucleus_image1).ravel(),
sitk.GetArrayViewFromImage(nucleus_image2).ravel(),
]
)
)