image arithmetic result not the same

4 次查看(过去 30 天)
Good evening, I have a question about image arithmetic. Below is some code that reads in a grayscale image and performs arithmetic on it. I want to know why the modified image does not look the same when we essentially divided the image pixels by 64 and then multiplied the result by 64. the resulting image should have been identical. Below is the image of the result:
b=imread('blocks.jpg');
class(b); %shows it is a uint8 image
b2=(b/64)*64;
subplot(1,2,1)
imshow(b)
title('original image')
subplot(1,2,2)
imshow(b2)
title('modified image')

采纳的回答

Walter Roberson
Walter Roberson 2018-2-26
>> uint8(65)/64
ans =
uint8
1
>> uint8(63)/64
ans =
uint8
1
we deduce from this that when you do arithmetic on an int8 or uint8, the result is always as if you had done the arithmetic in double precision, then rounded it, and converted back to the data type.
>> uint8(round(double(uint8(65))/double(64)))
ans =
uint8
1
>> uint8(round(double(uint8(63))/double(64)))
ans =
uint8
1

更多回答(1 个)

Steven Lord
Steven Lord 2018-2-26
How many unique values can the results of (b/64)*64 take on?
b = intmin('int8'):intmax('int8');
b2 = (b/64);
unique(b2)
Read this page for a description of why the list of unique values in b2 is so short.
  1 个评论
Aaron Connell
Aaron Connell 2018-2-26
Thank you very much I had no idea about the unique function. That gave me a clear answer.

请先登录,再进行评论。

Community Treasure Hunt

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

Start Hunting!

Translated by