0

如果我在 MATLAB 中使用此命令,图像会失真并且不会保留。为什么会这样?

>> b = imread('eight.tif');
>> b2 = imdivide(b,64);
>> bb2 = immultiply(b2,64);
>> imshow(bb2)
>> imshow(b);
4

2 回答 2

3

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')

在此处输入图像描述

于 2013-07-02T05:57:26.433 回答
2

这是因为您划分了一个 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 上执行的。

于 2013-07-02T06:02:09.283 回答