如果我在 MATLAB 中使用此命令,图像会失真并且不会保留。为什么会这样?
>> b = imread('eight.tif');
>> b2 = imdivide(b,64);
>> bb2 = immultiply(b2,64);
>> imshow(bb2)
>> imshow(b);
如果我在 MATLAB 中使用此命令,图像会失真并且不会保留。为什么会这样?
>> b = imread('eight.tif');
>> b2 = imdivide(b,64);
>> bb2 = immultiply(b2,64);
>> imshow(bb2)
>> imshow(b);
uint8
您正在对存储为(无符号 8 位)的图像像素执行操作。
将像素除以 64 基本上将值右移 6 (!) 位,也就是说,每个像素只留下 2 (1) 个最高有效位。乘以 64 会用零填充 6 个最低有效位 -数据丢失。
这是一个小例子:
>> a = uint8(153); dec2bin(a)
ans =
0b10011001
>> b = a/64; dec2bin(b)
ans =
0b00000010
请注意右侧 ( 011001
) 上的所有 6 位是如何消失的!仅保留左侧 ( ) 的两位10
(向右移动)。这种除法操作导致您丢失数据。
现在,乘回来:
>> c = b*64; dec2bin(c)
ans =
0b10000000
右边的所有 6 位现在都是0
!以前的值011001
已经消失了!
罗迪的另一个例子:
data = uint8(1:255);
figure(1), clf, hold on
plot(data, data, 'b')
plot(data, data/uint8(64)*uint8(64), 'r')
xlabel('Original Values')
ylabel('Ouptut values')
axis tight
legend('Original color space', 'Color space after integer division/multiply',...
'Location', 'NorthWest')
这是因为您划分了一个 uint8 图像。当您将图像(其值范围在 0 到 255 之间)除以 64 时,您将得到一个值为 0、1、2、3 和 4 的图像。当您将其乘回时,您将得到 0、64 、128、192 和 255,而不是您最初拥有的全部值范围。
看看这个:imshow(b/64*64)
。这将向您展示相同的工件。
现在检查一下:imshow(uint8(double(b)/64*64))
。这将向您显示原始图像。在这种情况下,您可以恢复这些值,因为操作是在双精度数而不是 uint8 上执行的。