how can I convert a double image into gray unit8 image?
Show older comments
Lets say that we have a 256x256 double image, how can we convert it into a 256x256 uint8?
5 Comments
Khairul Bashar Syed
on 26 Oct 2014
Say the image matrix is im. So just use im=uint8(im);
Satavisha
on 11 May 2024
But when I am using uint8 on my image the output is totally black then what to do?my image is (626x696 double).
Stephen23
on 11 May 2024
@Satavisha you may be able to leave it as double, depending on what you want to do. If your double image values are all less than 1, then using uint8() will make them all zero. If you leave them as double, then they will have their original values. Whenever I use double images, I display them with [] in the call to imshow so that the image scales properly for display.
imshow(doubleImage, []);
That way you can both keep your original values, AND see it when you display it.
If you use im2uint8, it somehow scales and then clips the data. It does not seem to "shift" the data to place your min at 0 (or some fraction of 255) and place your max at 255. Just try some examples:
im2uint8([0.5, 0.8])
im2uint8([91.2, 2345.6])
img8 = mat2gray([0.5, 0.6, 0.8]) % Produces a double image in the range 0-1
img8 = uint8(255 * img8) % Convert range to 0-255 and cast to uint8 data type.
img8 = uint8(rescale([91.2, 412.4, 2345.6], 0, 255))
Using rescale(), mat2gray() or imshow(...,[]) won't preserve the original contrast, and the latter only works on single-channel images anyway.
inpict = imread('peppers.png'); % RGB, properly-scaled uint8
inpict = double(inpict); % RGB, improperly-scaled double (not damaged yet)
imshow(inpict,[]) % does not work on RGB anyway
inpict = imread('peppers.png'); % RGB, properly-scaled uint8
inpict = im2double(inpict); % RGB, properly-scaled double
inpict = uint8(inpict); % RGB, unit-scale uint8 (permanently destroyed)
imshow(inpict,[]) % does not work on RGB anyway
inpict = imread('peppers.png'); % RGB, properly-scaled uint8
inpict = im2double(inpict); % RGB, properly-scaled double
inpict = im2uint8(inpict); % RGB, properly-scaled uint8
imshow(inpict) % it works fine
The answer is to pay attention to class and scale instead of presuming that image data always extends to the available dynamic range. If you're not paying attention to both, then you're just throwing away information. If you don't know what that means, just don't use double() or uint8(). Don't create improperly-scaled images unless you're making extra effort to make sure that you handle them correctly. Use im2double() and im2uint8() to handle conversion of both class and scale at the same time. So long as your images are always properly-scaled, imshow()/imwrite()/etc will handle them correctly, and contrast will be preserved.
If your input is a double array on an arbitrary scale, then yes, using rescale() or mat2gray() or normalize() might make sense as part of bringing the data into a standard scale.
Accepted Answer
More Answers (1)
Image Analyst
on 26 Oct 2014
1 vote
There is no function 'im2unit8' but there is a function im2uint8. It matters how you spell it and you spelled it incorrectly. I never use it - I use uint8(). im2uint8() also does scaling, of course you could use uint8(mat2gray()) to scale it to the full range.
2 Comments
Star Strider
on 26 Oct 2014
I misspelled it in my last Comment but not earlier. Waseem has it in his MATLAB search path but apparently can’t use it or uint8.
That seems to be the problem.
Star Strider
on 26 Oct 2014
Waseem — You spelled it correctly earlier in this thread. However we did not see your code, so I assumed you simply misspelled it in your Question.
Categories
Find more on Convert Image Type in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

