2014-04-09 48 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數據供以後處理。

相關問題