2009-12-13 86 views
2

我特別困在這種情況下(上面的例子是從MATLAB的幫助)我怎樣寫一個圖像文件

I = imread('liftingbody.png'); 
S = qtdecomp(I,.27); 
blocks = repmat(uint8(0),size(S)); 
for dim = [512 256 128 64 32 16 8 4 2 1]; 
    numblocks = length(find(S==dim)); 
    if (numblocks > 0) 
     values = repmat(uint8(1),[dim dim numblocks]); 
     values(2:dim,2:dim,:) = 0; 
     blocks = qtsetblk(blocks,S,dim,values); 
    end 
end 
blocks(end,1:end) = 1; 
blocks(1:end,end) = 1; 
imshow(I), figure, imshow(blocks,[]) 

如果我嘗試使用寫即塊圖像imwrite(blocks)然後整個圖像顯示爲黑色。這發生在任何輸入圖像上。但是我想要精確地寫出imshow在這裏顯示的輸出。誰能幫忙?

回答

7

您將塊創建爲uint8矩陣。按照慣例,MATLAB和圖像處理工具箱將uint8灰度視爲具有從0到255的值範圍。也就是說,0是黑色,255是白色。因此,只包含0和1的塊矩陣通常會顯示爲黑色和幾乎黑色。

imshow(blocks,[]) 

你用imshow的「自動測距」的語法,這顯示塊爲黑色,塊白色的最大值最小值:

當你使用顯示塊。

但是,當你使用imwrite保存塊時,它將0設爲黑色,255設爲白色。

嘗試初始化塊作爲邏輯矩陣代替,這樣的:

blocks = logical(size(S)); 

MATLAB和圖形處理工具箱將邏輯矩陣作爲二進制圖像,並顯示0爲黑色,1和白色。如果您傳遞一個邏輯矩陣來進行imwrite,它將創建一個1位深度的二進制圖像文件。

0

一個通用的答案是歸一化所述圖像是在範圍imwrite(blocks)

imwrite((blocks-min(blocks))/(max(blocks)-min(blocks))) 
相關問題