How exactly are .png vs numpy arrays (both grayscale) rendered as an imagestim objects in psychopy?

I’m trying to reproduce the results from an experiment a colleague of mine ran a while back. The issue is that when I run the same experiment (force fixation signal detection experiment) but with different software, I get ceiling effects when analyzing the results. He did not have close to the same results (not due to sampling error). We are using the same monitor with a linear calibration of gray levels to cd/m^2.

I think the issue has to do with how the actual arrays are rendered on the screen. My goal is to have the gray level values of the array (saved either as a numpy array with dtype="uint8" or .png file) displayed as is on the monitor without scaling the min and max of the array to 0 and 255, respectively. In other words, for a given image, if the min gray level is 15 and the max is 240, I do not want these values to be mapped to 0 and 255, respectively. Does psychopy.visual.imagestim do this? If so, then the contrast of the signal, embedded in a noise background, may increase and not by design.