例如,考虑下面的图像,它是unint8格式的jpeg。
在我的代码中,我需要将图像处理为unint8
,然后将其转换为logical
,然后再以unint8
格式再次使用。但显然没有办法让它恢复到它的状态"州。例如,请考虑以下代码:
image = imread('W1\Writer1_03_02.jpg');
bw_normal = im2bw(image, 0.1);
imshow(bw_normal);
它产生以下图像:
其中显示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);
在这种情况下产生的结果是:
基本上它没有按预期工作。也就是说,在每个阈值增量或减量时,我的图像中显示的单词应分别增大或缩小。但是,一旦它被转换为逻辑然后再返回,就不会发生这种情况。
根据我希望它如何随着阈值变化而增长和缩小,是否有可能以符合im2bw
的方式将逻辑图像转换回来?
答案 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数据供以后处理。