Читайте анимированный GIF с прозрачностью или альфа-каналом с помощью метода утилизации LeaveInPlace
Когда я читаю этот GIF, а затем показываю его imshow(I(:,:,:,2),map);
Есть пятна на рамке 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,.... и т. Д.)