MATLAB: How do these image bit conversions work?

8bit

So this is a basic question on image conversion algorithms.
If I load an image.
img = imread('peppers.png');
img = rgb2gray(img);
and then convert it back forth from 8 bit to 16 bit several times;
img = im2uint16(img);
img =im2uint8(img);
for like 10 times or so. The final resulting image seems exactly the same. That seems a bit odd to me, shouldn't there be some rounding errors when converting from 16-bit to 8-bit? That information should have been lost right? And shouldn't each iteration of this conversion amplify the error?
I am using MATLAB 2017b so its entirely possible that older versions of matlab may not do this…

Best Answer

im2uint16() notices that the input is uint8, and multiplies the input by a constant number to get the 16 bit version. The number it multiplies by is 257. This is the same thing as duplicating the bytes -- for example byte 0xD8 gets changed to 0xD8D8
im2uint8() applied to a uint16 image works by just dropping the last byte.
You can see that a cycle of these involves duplicating bytes and dropping them, which is going to leave you with the original bytes.
Related Question