2009-12-13 80 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))) 
相关问题