2014-04-09 43 views
2

例如,考虑下面的图像,它是一个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

Whichy表明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一起使用的方式?

+2

从灰色/彩色转换为二进制图像时,基本上会丢失信息,这至少是您无法接近原始图像的原因之一。但我认为,就你而言,你只需要平滑一点二进制图像,看起来足够接近。 – Divakar

回答

2

不,不可能直接从逻辑转换回uint8,同时保持im2bw所需的灰度级值。信息在初始转换为逻辑期间丢失。

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

取而代之,你可以做什么,取决于你的代码,只是将图像保存为一个单独的变量uint8,然后再将其转换为逻辑。这样,您将始终拥有原始的uint8数据供以后处理。

相关问题