how can I convert a double image into gray unit8 image?
조회 수: 14 (최근 30일)
이전 댓글 표시
Lets say that we have a 256x256 double image, how can we convert it into a 256x256 uint8?
댓글 수: 5
Image Analyst
2024년 5월 11일
@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))
DGM
2024년 5월 11일
편집: DGM
2024년 5월 11일
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.
채택된 답변
Star Strider
2014년 10월 26일
댓글 수: 11
Star Strider
2014년 10월 26일
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
2014년 10월 26일
My pleasure!
I wish we could have gotten im2uint8 or uint8 working for you.
추가 답변 (1개)
Image Analyst
2014년 10월 26일
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
Star Strider
2014년 10월 26일
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
2014년 10월 26일
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.
참고 항목
카테고리
Help Center 및 File Exchange에서 Convert Image Type에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!