Turning a grayscale image into a histogram of the intensity of the pixels of that image
JPG vs PNG
Somehow, your code seems to produce wrong results with the above JPG. When used with the same image converted to PNG, the histogram looks much better, and much closer to what Photoshop displays.
ImageIO.read(file) seems to not return the correct RGB values with the above JPG. It is outside of your code though, and seems to be called by Picture class.
As mentioned by @Nayuki, it seems to be a known bug/feature:

https://bugs.openjdk.java.net/browse/JDK-5051418
https://stackoverflow.com/questions/31312645/java-imageio-grayscale-png-issue
https://stackoverflow.com/questions/32583772/reading-grayscale-png-image-files-without-distortion

Double -&gt; int
getIntensity returns a double.
For example, getIntensity(new Color(1, 1, 1)) returns 0.9999999999999999, which is very close to 1.0 but strictly smaller than 1.0.
When you cast this double to an integer in int intensity = (int) a[i][j], it gets converted to 0, which isn't desired.
With your current code, the first histogram bins look like this:
[37509, 2429, 0, 3981, 0, 1763, 1757, 4131, 0, 2016, 4718, 0, 6498, 0, 3526, 7824, ...

If you replace the line with int intensity = (int) Math.round(a[i][j]);, the first bins look like this:
[32317, 5192, 2429, 2327, 1654, 1763, 1757, 2034, 2097, 2016, 2230, 2488, 2947, 3551, 3526, 3683, 4141, ...

Which should produce a smoother and more correct diagram.
As mentioned by @MarkRansom:

the goal should be to redistribute the values in a way that preserves
their overall distribution.

Rounding the doubles should work fine in the above case, because the values are very close to integers. In the general case, truncating might be preferred.