【问题标题】:Why the result not equivalent with original image?为什么结果与原始图像不等效?
【发布时间】:2013-06-29 09:18:54
【问题描述】:

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

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

【问题讨论】:

  • 我无法重现这个,在这里可以正常工作(除了一些明显的颜色变化)...你能上传你的图吗?
  • “扭曲”是什么意思?
  • 如果buint8 数组怎么办?我认为对于b 的所有元素,小于 64 个对应的b2 元素将为零,bb2 元素由于整数运算而将为零。

标签: image matlab image-processing image-manipulation


【解决方案1】:

您正在对存储为 uint8(无符号 8 位)的图像像素执行操作。
将像素除以 64 基本上将值右移 6 (!) 位,也就是说,每个像素只留下 2 (1) 个最高有效位。乘以 64 会用零填充 6 个最低有效位 - 数据丢失


这是一个小例子:

>> a = uint8(153); dec2bin(a)
ans =
 0b10011001
>> b = a/64;       dec2bin(b)
ans =
 0b00000010

注意右边的所有 6 位 (011001) 是如何消失的!只剩下左边的两位(10)(向右移动)。此除法操作导致您丢失数据
现在,乘回来:

>> c = b*64;       dec2bin(c)
ans =
 0b10000000

右边的所有 6 位现在都是0!以前的值 011001 已消失!


Rody 的另一个例子:

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

【讨论】:

  • 是的,我认为会发生这样的事情,但他说“变形”,所以我认为形状、大小和/或比例发生了变化......好吧,无论如何+1 :)
  • 我没听懂。我可以用外行的方式解释一下吗?
  • @user75736 你到底有什么不明白的?你熟悉uint8 数据类型吗?
【解决方案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 上执行的。

【讨论】:

  • 顺便说一句,你可以使用unique(b(:))。这将列出b 矩阵中的所有唯一值,它可以帮助您检查发生了什么变化。
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 2016-05-25
  • 2022-10-16
  • 1970-01-01
  • 2019-09-09
  • 2015-02-13
  • 1970-01-01
  • 2021-02-01
相关资源
最近更新 更多