FFMPEG在缩放后是否应用模糊滤镜?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFMPEG在缩放后是否应用模糊滤镜?相关的知识,希望对你有一定的参考价值。

所以我正在实现我自己的双线性缩放版本,并将结果与​​FFMPEG和ImageMagick进行比较。这些工具创建了我的图像的缩放版本,但似乎结果不是仅通过应用插值操作获得的,看起来结果在缩放之后会出现模糊以消除锯齿。这就是我的意思。

这是原始图像(6x6 yuv422p):

https://snag.gy/Z5pa8f.jpg

如您所见,只有黑色和白色的列。在使用双线性滤波器进行缩放操作后,我得到黑色和白色之间的灰色列,这是预期的。这是我的结果:

我的形象(12x12 yuv422p):

https://snag.gy/deMJy1.jpg

现在问题是FFMPEG的结果。正如我将在下面展示的那样,FFMPEG创建的图像只有一个黑色和白色的列,其余的只有灰色阴影,这对于双线性滤波是没有意义的。

FFMPEG图像(12x12 yuv422p):

https://snag.gy/prz54g.jpg

有人可以告诉我FFMPEG在这种情况下做了什么吗?

    // Iterate through each line
    for(int lin = 0; lin < dstHeight; lin++){
        // Get line in original image
        int linOrig = lin / scaleHeightRatio;
        float linOrigRemainder = fmod(lin, scaleHeightRatio);
        float linDist = linOrigRemainder / scaleHeightRatio;

        // For border pixels
        int linIndexA = linOrig;
        int linIndexB = linOrig + 1;
        if(linIndexB >= srcHeight)
            linIndexB = linIndexA;
        linIndexA *= srcWidth;
        linIndexB *= srcWidth;

        // Iterate through each column
        for(int col = 0; col < dstWidth; col++){
            // Get column in original image
            int colOrig = col / scaleWidthRatio;
            float colOrigRemainder = fmod(col, scaleWidthRatio);
            float colDist = colOrigRemainder / scaleWidthRatio;

            // If same position as an original pixel
            if(linOrigRemainder == 0 && colOrigRemainder == 0){
                // Original pixel to the result
                dstSlice[0][lin * dstWidth + col] = srcSlice[0][linOrig * srcWidth + colOrig];
                dstSlice[1][lin * dstWidth + col] = srcSlice[1][linOrig * srcWidth + colOrig];
                dstSlice[2][lin * dstWidth + col] = srcSlice[2][linOrig * srcWidth + colOrig];

                // Continue processing following pixels
                continue;
            }

            // For border pixels
            int colIndexA = colOrig;
            int colIndexB = colOrig + 1;
            if(colIndexB >= srcWidth)
                colIndexB = colIndexA;

            // Perform interpolation
        }
    }
答案

所以,我发现了问题。考虑到性能,我将每个像素从原始图像复制到与后者像素完全对齐的缩放图像。之后,我只插入了未知像素或未对齐像素,这实际上不是双线性插值的工作原理,因为它会产生锯齿。

FFMPEG和所有其他图像处理工具在原始像素周围创建填充,因此在我的情况下,我应该将8x8图片缩放到12x12图片,这将导致NO像素将在原始像素和缩放图片之间对齐。由于未对齐,缩放图片的像素始终是原始图像的像素的插值,它是周围像素的加权平均值,这就是为什么它看起来像FFMPEG缩放的结果是模糊的(因为它是基本上是一个平均值)。

以上是关于FFMPEG在缩放后是否应用模糊滤镜?的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg滤镜(1)

FFmpeg滤镜使用指南

FFmpeg滤镜使用

FFmpeg滤镜API用法详解

如何在ffmpeg中使用滤镜技术

ffmpeg文档32-滤镜链图介绍