Matlab使用VideoWriter生成彩色图像序列视频输出为黑白问题求助
问题原因
- 最常见的触发原因是输入的PNG为索引彩色格式:
imread读取这类图像时会分别返回索引值矩阵(单通道)和独立的颜色映射表,现有代码仅使用了返回的第一个单通道索引值矩阵写入视频,相当于直接把索引值作为灰度值处理,最终输出就会是黑白效果。 - 次要触发原因:输入PNG为带透明通道的RGBA四通道格式,
VideoWriter的MPEG-4编码默认不支持透明通道,处理时会错误丢弃RGB通道或直接取单通道数据。 - 另外如果读取到的图像数据为0-1范围的double类型,也可能因为编码范围不匹配导致色彩显示异常。
解决方案
修改图像读取和预处理逻辑,兼容不同格式的PNG输入,修改后的完整代码如下:
%% 4.) GENERATE THE MOVIE disp("Generate the Movie..."); imageNames = dir(fullfile('images','*.png')); imageNames = {imageNames.name}'; outputVideo = VideoWriter(fullfile('images','AcousticCamera.mp4'),'MPEG-4'); outputVideo.FrameRate = 10; outputVideo.Quality = 95; open(outputVideo) for ii = 1:length(imageNames) %% loop over the images % 同时接收图像数据和颜色映射表 [img, colorMap] = imread(fullfile('images',imageNames{ii})); % 索引彩色图转三通道真彩色 if ~isempty(colorMap) img = ind2rgb(img, colorMap); end % 剔除RGBA格式的透明通道 if size(img, 3) == 4 img = img(:, :, 1:3); end % 统一转为uint8格式适配MPEG-4编码要求 if isa(img, 'double') img = im2uint8(img); end writeVideo(outputVideo,img) end close(outputVideo)
修改点说明:
- 新增索引彩色图转换逻辑:判断是否返回了颜色映射表,存在的话调用
ind2rgb将单通道索引值转为标准三通道RGB图像 - 新增四通道RGBA处理逻辑:截取前三个RGB通道写入,避免编码时通道解析错误
- 新增数据类型统一逻辑:将double类型的0-1范围图像转为uint8格式,和MPEG-4编码的亮度范围要求匹配
内容的提问来源于stack exchange,提问作者clauer
相关产品推荐
相关产品推荐

