使用 cmd ffmpeg 对图像进行反拜尔处理时,存在差异

使用 cmd ffmpeg 对图像进行反拜尔处理时,存在差异

我有这样的拜耳图像https://drive.google.com/file/d/1OjHQyR44ECMMs4BtlZacejkmgSjeY2Nq/view?usp=sharing

我需要获取两个输出文件

  1. 直接将此图像去马赛克并保存为.bmp
  2. 将图像解拜耳压缩为.h264,然后解压缩并保存为.bmp

为了做到这一点,我使用了这样的批处理脚本

@echo off

set main_dir=my_main_dir
set file_name=orig_bayer
set input=%main_dir%\%file_name%.bmp
set output_direct_debayer_bmp=%main_dir%\gpl_cmd_direct_decompress.bmp
set output_h264=%main_dir%\result_h264_%file_name%.h264
set output_h264_to_bmp=%main_dir%\gpl_cmd_decompress.bmp
set video_size=4096x3000

rem direct debayering 
ffmpeg -y -hide_banner -i %input% -vf format=gray -f rawvideo pipe: | ffmpeg -hide_banner -y -f rawvideo -pixel_format bayer_rggb8 -video_size %video_size% -i pipe: -pix_fmt yuv420p %output_direct_debayer_bmp%

rem debaer -> h264 -> decompress
ffmpeg -y -hide_banner -i %input% -vf format=gray -f rawvideo pipe: | ffmpeg -hide_banner -y -framerate 30 -f rawvideo -pixel_format bayer_rggb8 -video_size %video_size% -i pipe: -c:v hevc_nvenc -qp 0 -pix_fmt yuv420p %output_h264%
ffmpeg -y -i %output_h264% -f image2 %output_h264_to_bmp% -hide_banner

pause

因此,使用方法 #1 时,我

...
rem direct debayering 
ffmpeg -y -hide_banner -i %input% -vf format=gray -f rawvideo pipe: | ffmpeg -hide_banner -y -f rawvideo -pixel_format bayer_rggb8 -video_size %video_size% -i pipe: -pix_fmt yuv420p %output_direct_debayer_bmp%
...

我得到这样的输出https://drive.google.com/file/d/1-DA2440zZ2F9WRcd15iqFUt3UhtkQRZT/view?usp=sharing

并使用方法 #2

...
rem debaer -> h264 -> decompress
ffmpeg -y -hide_banner -i %input% -vf format=gray -f rawvideo pipe: | ffmpeg -hide_banner -y -framerate 30 -f rawvideo -pixel_format bayer_rggb8 -video_size %video_size% -i pipe: -c:v hevc_nvenc -qp 0 -pix_fmt yuv420p %output_h264%
ffmpeg -y -i %output_h264% -f image2 %output_h264_to_bmp% -hide_banner
...

我得到这样的输出https://drive.google.com/file/d/103dtgaDVaXsNy13XHaVLSgugQhh0Uj9N/view?usp=sharing

第二个颜色有差异......

答案1

它看起来像是颜色转换算法中的一个错误,但我不确定。

替换时的颜色-pix_fmt yuv420p-pix_fmt yuv444p直接转换相同。

  • 颜色转换路径:拜耳->yuv420p修改颜色。
  • 颜色转换路径:拜耳 -> yuv444p工作正常。

共同点去马赛克算法从拜耳转换为 RGB,而不是从拜耳直接转换为 YUV,但我不知道 FFmpeg 使用的内部转换管道。

我找到了一种使用以下颜色转换路径对 yuv420p 进行编码的解决方案:
拜耳 -> yuv444p -> yuv420p

解决方案是使用format视频滤镜。在 之后
添加参数:。-vf format=yuv444p-i pipe:

使用以下命令:

ffmpeg -y -hide_banner -i %input% -vf format=gray -f rawvideo pipe: | ffmpeg -hide_banner -y -framerate 30 -f rawvideo -pixel_format bayer_rggb8 -video_size %video_size% -i pipe: -vf format=yuv444p -c:v hevc_nvenc -qp 0 -pix_fmt yuv420p %output_h264%

结果(缩小尺寸)从左到右:

  • 不含-vf format=yuv444p(颜色不正确):
  • 使用-vf format=yuv444p(正确的颜色):
  • 直接转换(正确的颜色):

在此处输入图片描述在此处输入图片描述在此处输入图片描述


笔记:

相关内容