Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 为什么结果与原始图像不一致?_Image_Matlab_Image Processing_Image Manipulation - Fatal编程技术网

Image 为什么结果与原始图像不一致?

Image 为什么结果与原始图像不一致?,image,matlab,image-processing,image-manipulation,Image,Matlab,Image Processing,Image Manipulation,如果我在MATLAB中使用这个命令,图像会失真并且不会保留。为什么会这样 >> b = imread('eight.tif'); >> b2 = imdivide(b,64); >> bb2 = immultiply(b2,64); >> imshow(bb2) >> imshow(b); 您正在对存储为uint8(无符号8位)的图像像素执行操作。 将像素除以64,基本上将值右移6(!)位,也就是说,每个像素只保留2(1)个最高有效位

如果我在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
注意右边的6位(
011001
)是如何消失的!只保留左侧的两位(
10
)(向右移位)。此除法操作导致数据丢失
现在,往回乘:

>> c = b*64;       dec2bin(c)
ans =
 0b10000000
右边的所有6位现在都是
0
!以前的值
011001
已消失


另一个例子是:


您正在对存储为
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
已消失


另一个例子是:


这是因为您分割了uint8图像。将图像(其值范围介于0和255之间)除以64,最终得到的图像值为0、1、2、3和4。当您将其相乘时,您将得到0、64、128、192和255,而不是您最初拥有的完整值范围

请查看:
imshow(b/64*64)
。这将向您显示相同的工件


现在检查这个:
imshow(uint8(双(b)/64*64))
。这将显示原始图像。在这种情况下,您可以恢复值,因为操作是在双精度而不是uint8上执行的。

这是因为您分割了uint8图像。将图像(其值范围介于0和255之间)除以64,最终得到的图像值为0、1、2、3和4。当您将其相乘时,您将得到0、64、128、192和255,而不是您最初拥有的完整值范围

请查看:
imshow(b/64*64)
。这将向您显示相同的工件


现在检查这个:
imshow(uint8(双(b)/64*64))
。这将显示原始图像。在这种情况下,您可以恢复值,因为操作是在双精度而不是uint8上执行的。

我无法复制此操作,在这里可以正常工作(除了一些明显的颜色变化)…您可以上传您的图形吗?您所说的“扭曲”是什么意思?如果
b
uint8
数组怎么办?我认为对于
b
较小的所有元素,64个对应的
b2
元素将是零,由于整数运算,
bb2
元素也将是零。我不能复制这个,在这里工作很好(除了一些明显的颜色变化)…你能上传你的数字吗?你说的“扭曲”是什么意思?如果
b
uint8
数组怎么办?我认为对于
b
较小的所有元素,64个对应的
b2
元素将是零,因此
bb2
元素也将是零,这是由于整数算术。是的,我认为这会发生一些事情,但他说“扭曲”,所以我认为形状、大小和/或比率发生了变化……嗯,对你来说+1:)我没明白。请给我一个通俗的解释好吗?@user75736你到底不明白什么?你熟悉uint8数据类型吗?是的,我想这会发生一些事情,但他说“扭曲”,所以我认为形状、大小和/或比率发生了变化……好吧,反正你是+1:)我不明白。请给我一个通俗的解释好吗?@user75736你到底不明白什么?您熟悉
uint8
数据类型吗?顺便说一句,您可以使用
unique(b(:)
。这将列出
b
矩阵中的所有唯一值,它可以帮助您检查更改的内容。顺便说一句,您可以使用
unique(b(:)
)。这将列出
b
矩阵中的所有唯一值,它可以帮助您检查更改的内容。