2016-01-23 23 views
15

MATLAB'da .gif animasyonları ile bazı testler yaparken, bir şekilde gif'in saydamlığını okuyamayacağımı fark ettim.Alfa kanalıyla animasyonlu bir gif nasıl okunur

Örnek:

[img,cmap]=imread('Finnandjake.gif'); 

img yaparsanız

enter image description here

(Original source of the gif)

yedekli 3 boyuta (garip) ile 4D olduğunu. o (img=squeeze(img);), sıkma sonra (imshow(img(:,:,30),cmap)) göstermek durumunda:

enter image description here

şeffaflık böylece özelliklerini silme, arka plan olarak görüntüden başka bir renk kullanılarak gitti. Ancak, alpha boş bir alpha döndürür.

Açıkçası, alfa bilgisi bir yerde görüntüdedir, MATLAB'da nasıl okuyabilirim?
+1

ben matlab .gif resim için şeffaflık yönetemez düşünüyorum. Mathworks.com'dan: 'imread (___) ek olarak görüntü şeffaflığını döndürür. Bu sözdizimi yalnızca PNG, CUR ve ICO dosyaları için geçerlidir. ' – obchardon

+0

@obchardon Fark ettim, ancak sonra, bir gif dosyasını alfa bilgisi ile MATLAB'a yükleme yolu var mı? Sadece bir gif dosyası, o kadar zor olamaz –

+2

Imagemagick kullanarak ve PNG'leri bir döngü içinde okuyarak GIF'i PNG'ye dönüştürmeyi önermek istedim. Ancak MATLAB'ın PNG'deki Alpha katmanını tanımasına bile gerek yok, ancak dosyada * var *. :-( – hbaderts

cevap

9

/Güncelleştirme: Kodu MATLAB file exchange adresinde hazırladım. Yayınlanan versiyon OCTAVE ile uyumludur ve bazı belgelerle birlikte gelir.


Bu çözümle ortaya çıktım. Dönüş argümanları yığılmış görüntüler, renk haritası ve saydamlığa karşılık gelen dizinlerdir.

%do not use, instead use: http://www.mathworks.com/matlabcentral/fileexchange/55693-transparentgifread-filename- 
function [stack,map,transparent]=transparentGifRead(filename) 
if ~exist(filename,'file') 
    error('file %s does not exist',filename); 
end 
info=imfinfo(filename); 
%Check if color map for all frames is the same 
if any(any(any(diff(cat(3,info.ColorTable),[],3)))) 
    error('inconsistent color map') 
else 
    map=info(1).ColorTable; 
end 
%Check if transparent color for all frames is the same 
if any(diff([info.TransparentColor])) 
    error('inconsistent transparency information') 
else 
    transparent=info(1).TransparentColor-1; 
end 
import java.io.* 
str = javax.imageio.ImageIO.createImageInputStream(java.io.File(filename)); 
t = javax.imageio.ImageIO.getImageReaders(str); 
reader = t.next(); 
reader.setInput(str); 
numframes = reader.getNumImages(true); 
for imageix = 1:numframes 
    data = reader.read(imageix-1).getData(); 
    height = data.getHeight(); 
    width = data.getWidth(); 
    data2 = reader.read(imageix-1).getData().getPixels(0,0,width,height,[]); 
    if imageix == 1 
     stack=zeros(height,width,1,numframes,'uint8'); 
    end 
    %row major vs column major fix 
    stack(:,:,1,imageix) = reshape(data2,[width height]).';%' 
end 
str.close(); 
end 

Bazı gösteri kod yeşil şeffaf pikseller renklendirmek için:

[stack,map,transparent]=transparentGifRead('tr.gif'); 
map(transparent+1,:)=[0,1,0] %offset 1 because uint8 starts at 0 but indices at 1 
for frame=1:size(stack,ndims(stack)) 
    imshow(stack(:,:,frame),map); 
    pause(1/25); 
end 
+1

İki sayı: x = fullfile (matlabroot, 'toolbox \ matlab \ imagesci', 'private', 'imgifinfo.m'); 'x olmalıdır = fullfile (matlabroot, 'toolbox', 'matlab', 'imagesci ',' özel ',' imgifinfo.m '); çapraz platform çalışması. Ayrıca, renk eşlemine endekslenen görüntü verileriyle birebir bir hataya sahip görünüyorsunuz. – horchler

+0

@horchler: Geri bildirim için teşekkürler, sadece değerleri karşılaştırdım ve işlevimin uint8 yerine iki kez döndüğünü fark etmedim. Şimdi uint8 değerini döndürür, burada colormap ile tamsayı değeri arasında 1 ofsetin olması amaçlanır. – Daniel

+1

Özel bir işlevi çağırmak yerine, her bir karenin “TransparentColor” özelliği gibi ayrıntıları almak için 'info = iminfo (dosya adı); – horchler