# I have a ct image that values of pixel of it is between 0-4000 how can I convert it to an image with 0-255 ?

23 views (last 30 days)
sara on 5 Sep 2014
Commented: Image Analyst on 30 Jul 2020
I have a ct image that values of pixel of it is between 0-4000 how can I convert it to an image with 0-255 ?
##### 2 CommentsShowHide 1 older comment
Iain on 5 Sep 2014
img = double(HU);
img = img - min(img(:));
maximum = max(img(:));
grayscale = (img / maximum) * 255;

Image Analyst on 5 Sep 2014
There is a function that scales an array to 0-1. It's called mat2gray. Then just multiply by 255.
image8bit = uint8(255 * mat2gray(image16bit));
Image Analyst on 30 Jul 2020
There is now another way, using the new rescale() function:
grayImage = uint16([10, 4000, 65535]) % Sample uint16 image.
b8 = rescale(grayImage, 0, 255) % If you want double
class(b8)
b8 = uint8(rescale(grayImage, 0, 255)) % If you want uint8
class(b8)
grayImage =
1×3 uint16 row vector
10 4000 65535
b8 =
0 15.528 255
ans =
'double'
b8 =
1×3 uint8 row vector
0 16 255
ans =
'uint8'

Guillaume on 5 Sep 2014
If the image is stored as double, then Yawar's answer is correct. If your image is stored as uint16, then it won't work, you'll have to convert the image to double first.
For most image processing function to work correctly on an image in the range 0-255, it needs to be of type uint8. If the type is double, most functions assume the range 0-1.
The following is guaranteed to work:
img8bit = im2uint8(double(img) / 4000);
This is equivalent to:
img8bit = uint8(double(img)/4000 * 255);
Christin Panjaitan on 5 Sep 2014
[1] img12bitish = double(img8bit) / 255 * 4000; %it might return to the original range but the original value has been changing.
For the word of "size", I mean range. Sorry, I just wrong to use the word.

Yawar Rehman on 5 Sep 2014
img = (img / 4000) * 255;
Iain on 5 Sep 2014
This'd be better....
img = double(img);
img = img - min(img(:));
maximum = max(img(:));
img = (img / maximum) * 255;