Читайте анимированный GIF с прозрачностью или альфа-каналом с помощью метода утилизации LeaveInPlace

Когда я читаю этот GIF, а затем показываю его imshow(I(:,:,:,2),map); Есть пятна на рамке GIF, я думаю, что это возможно, потому что метод GIF избавления. Как с этим бороться?

предназначенный, анимированный GIF

[I map]=imread('smile.gif');

Это то, что я получил.

мой результат, с пятнами

1 ответ

Используйте приведенный ниже код для imshow кадр 2 анимированного GIF с альфа-каналом.

Здесь только первый кадр gif имеет полное изображение смайлика, а фон смайлика содержит TransparentColor, В остальных кадрах некоторые пиксели смайлика также устанавливаются как TransparentColor, Таким образом, чтобы получить другие кадры, вы должны заменить TransparentColor пиксели с пикселями из изображения RGB предыдущего кадра. Это похоже на размещение требуемого кадра поверх предыдущих кадров, чтобы получить полное изображение.

% which frame to show
frame=2;

% filename of gif image
filename='smile.gif';

% Reading gif image
[I map]=imread(filename);

% get information from graphics file( we need the TransparentColor 
% and ColorTable of the gif)
info=imfinfo(filename);

% Set the transparent color to what ever color you like. 
% Because this will be the background color for frame 1 and this
% will be copied to the next frames.
info(1).ColorTable(TransparentColor,:)=[1 1 1];
% RGB Image of first frame
im_new=ind2rgb(I(:,:,:,1),info(1).ColorTable);

% loop from second to the required frame
for frameIndex=2:frame
% get information from graphics file( we need the TransparentColor 
% and ColorTable of the gif)
info=imfinfo(filename);    

% Get the transparentColor of current frame
TransparentColor=info(frameIndex).TransparentColor;

% Change that transparentColor in the map to [NaN NaN NaN]
info(frameIndex).ColorTable(TransparentColor,:)=[NaN NaN NaN];

% Generate rgb image with I and modified color table
imNaN=ind2rgb(I(:,:,:,frameIndex),info(frameIndex).ColorTable);

% We are setting it as [NaN NaN NaN] because then we can find 
% thoses transparent pixels using 'isnan(imNaN)'. 

% Change that transparentColor in the map to [0 0 0] and generate 
% another rgb image
info(frameIndex).ColorTable(TransparentColor,:)=[0 0 0];
im=ind2rgb(I(:,:,:,frameIndex),info(frameIndex).ColorTable);

% 'im' will have [0 0 0] in pixel places of [NaN NaN NaN].
% We are putting zero here because then we can find where there 
% is NaN in 'imNaN' and get those pixels from the previous rgb frame and 
% add thoses with the zero in 'im'.

% copy the previous rgb frame to 'im0'
im0=im_new;

% Now as said before we are going to find the pixels with 
% 'NaN' present using 'isnan(imNaN)' this will be one or zero 
% for each pixel. If the pixel is 'NaN' then 'one' otherwise 'zero'.
% Now we mutiply this with the coresponding pixel in frame one. If the
% pixel is not 'NaN' then the product will zero otherwise pixel 
% value of im0. We add this to 'im'. Which has 'zero' instead of 'NaN'. 
% The result will be, where there is 'NaN', pixel from 'im0' is copied 
% to im_new otherwise 'im_new' will have 'im'.
im_new=((isnan(imNaN).*im0))+im;

% This is repeated till the required frame is reached
end

% show image
imshow(im_new);

Так как у этого gif есть прозрачные пиксели. Здесь я использовал белый, чтобы заполнить прозрачную часть. Если вам нужно другое изменение цвета [1 1 1] в

info(1).ColorTable(TransparentColor,:)=[1 1 1];

до необходимого значения. Каждое значение варьируется от 0 to 1, Для которого 0 - полное отсутствие этого цветового компонента, а 1 - полное наличие этого цветового компонента. Для промежуточных цветов используйте десятичные значения (0,25,0,7,.... и т. Д.)

Другие вопросы по тегам