为什么图像不能完全从逻辑转换回来

时间:2014-04-09 19:42:47

标签: image matlab image-processing image-segmentation

例如,考虑下面的图像,它是unint8格式的jpeg。

enter image description here

在我的代码中,我需要将图像处理为unint8,然后将其转换为logical,然后再以unint8格式再次使用。但显然没有办法让它恢复到它的状态"州。例如,请考虑以下代码:

image = imread('W1\Writer1_03_02.jpg');

bw_normal = im2bw(image, 0.1);
imshow(bw_normal);

它产生以下图像:

enter image description here

其中显示im2bw在0.1阈值下完美运行。但如果我将其转换为logical然后再转回unint8然后执行上述命令,则结果会有很大不同。

image = imread('W1\Writer1_03_02.jpg');
image = im2bw(image,graythresh(image));
image = im2uint8(image);

bw_normal = im2bw(image, 0.1);
imshow(bw_normal);

在这种情况下产生的结果是:

enter image description here

基本上它没有按预期工作。也就是说,在每个阈值增量或减量时,我的图像中显示的单词应分别增大或缩小。但是,一旦它被转换为逻辑然后再返回,就不会发生这种情况。

根据我希望它如何随着阈值变化而增长和缩小,是否有可能以符合im2bw的方式将逻辑图像转换回来?

1 个答案:

答案 0 :(得分:2)

不,在保持im2bw所需的灰度值时,无法直接从逻辑转换回uint8。在初始转换为逻辑时,信息会丢失。

例如,原始uint8图像的值可以是从0到255的任何整数。对im2bw的调用选择一些阈值并将低于该阈值的任何数字转换为0,并将其上方的任何数字转换为1.因此,现在的逻辑图像包含值0或1.然后,当您应用im2uint8时,0& 1被映射到0& 255,但由于逻辑图像中只有两个可能的值,因此uint8图像中只能获得两个可能的值:每个像素将为0或255.因此,第二个im2bw将给出相同的结果无论阈值如何,因为0和0之间的任何阈值。 255只会映射0& 255回到0& 1。

根据您的代码,您可以做的只是将图像作为uint8保存在单独的变量中,然后再将其转换为逻辑。这样,您将始终拥有原始的uint8数据供以后处理。