how can I convert a double image into gray unit8 image?

18 views (last 30 days)
Lets say that we have a 256x256 double image, how can we convert it into a 256x256 uint8?
  5 Comments
Image Analyst
Image Analyst 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])
ans = 1x2
128 204
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
im2uint8([91.2, 2345.6])
ans = 1x2
255 255
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
You could manually scale it using mat2gray or rescale
img8 = mat2gray([0.5, 0.6, 0.8]) % Produces a double image in the range 0-1
img8 = 1x3
0 0.3333 1.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
img8 = uint8(255 * img8) % Convert range to 0-255 and cast to uint8 data type.
img8 = 1x3
0 85 255
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
img8 = uint8(rescale([91.2, 412.4, 2345.6], 0, 255))
img8 = 1x3
0 36 255
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
DGM
DGM on 11 May 2024
Edited: DGM on 11 May 2024
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.

Sign in to comment.

Accepted Answer

Star Strider
Star Strider on 26 Oct 2014
I would use the uint8 function.
  11 Comments
Star Strider
Star Strider on 26 Oct 2014
Actually, very few of us here are MathWorks employees. Most of us (including me) are unpaid volunteers who do our individual and collective best to share what we know.
If you cannot get im2unit8 or uint8 working, contact MathWorks Tech Support to see if they can figure out what the problem is.
Star Strider
Star Strider on 26 Oct 2014
My pleasure!
I wish we could have gotten im2uint8 or uint8 working for you.

Sign in to comment.

More Answers (1)

Image Analyst
Image Analyst on 26 Oct 2014
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
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
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.

Sign in to comment.

Categories

Find more on Convert Image Type in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!