MATLAB: LookUp Table code to convert uint8 image to uint16 image using LUT

lookup tablelut

I have an image and a look up table that I want to use to transform the image pixel values. My original image (A) is uint8. My LUT has 256 rows with values between 0 and 4095. I want the output image (B) to have values between 0 and 4095.
I tried using B = intlut(A, LUT), but it does not work because it enforces the A, LUT, and B all have same class (either Uint8 or 16).
If I convert A to uint16 and try B = intlut(A, LUT), I will have this error because LUT is only 256 rows:
_ Error using coder.internal.errorIf (line 8) LUT must contain 65536 elements if it is uint16 or int16._
Here is a sample code:
A = imread('cameraman.tif');
LUT = uint16(repmat([0 150 255 4095],1,64));
B = intlut(A, LUT)
Any suggestions? By the way, I can't use the simulink. Also no for loop because it is slow. I want this vectorized.
Thanks

Best Answer

B = LUT(double(A) + 1);
The double(A) is there because A is uint8, maximum 255, and uint8(255)+1 is uint8(255) rather than the 256 needed to act as the correct index.
Related Question