resdet - 检测放大图像的源分辨率。
依赖项
resdet 捆绑了 KISS FFT 作为其 FFT 实现(宽松许可证),但如果可用,也可以使用 FFTW(GPL,可能更快)。 图像加载器可以使用 libpng、libjpeg、mjpegtools(用于 yuv4mpeg)和 MagickWand 中的任何一个或全部。
如果客户端提供图像数据,libresdet 可以完全独立使用。
构建
工具和提供的构建脚本针对具有 bash、pkg-config、GNU make 和 GCC 兼容 C 编译器的通用 *nix 环境,使用类似 autotools 的构建过程:
./configure
make
make install
使用 configure --help
查看选项
示例
使用 ImageMagick 的 convert
命令调整一张图片的大小并检测它:
$ convert blue_marble_2012.png -resize 150% resized.png
$ resdet resized.png
given: 768x768
best guess: 512x512
all width height
512 (77.03%) 512 (76.38%)
仅测试图像是否已被放大:
$ resdet -v0 resized.png && echo upscaled
upscaled
查看 resdet -h 获取更多选项。
API
resdet 可以通过包含 resdet.h 并链接 libresdet 作为库使用。构建后使用 make install-lib
安装库。
包含了一个 pkg-config 文件;可以通过 pkg-config --libs --static resdet
获取链接器标志。
API 文档可在 doc 子目录中找到。
尽管提供的构建脚本针对类 Unix 系统,但 libresdet 使用标准 C 编写,应该可以在任何具有 C99 libc 的平台上使用。
常见问题
该工具接收可能已被放大的图像或视频帧,并尝试精确识别原始分辨率。
如何实现?
传统的重采样方法往往表现为信号频域的奇异扩展与低通滤波器的结合(其中滤波器的形状在各种重采样方法中有所不同)。方便的是,离散余弦变换使这种扩展的零交叉点恰好落在源图像放大的偏移量处。resdet 通过尝试识别这些反转来工作。
获得最佳结果
resdet 在尽可能接近源的图像上效果最佳。滤波和压缩伪影可能会显著降低此测试的准确性。一般来说,更清晰和详细的图像会表现更好。
色彩空间
如果在图像最初调整大小的相同色彩空间中执行检测,resdet 可以提供显著更准确的结果。如果图像可能在线性光色彩空间中调整大小,然后转换为非线性色彩空间(如 sRGB),那么也值得尝试在线性光中进行检测。
这里是一个使用 ImageMagick 的 convert
命令将色彩空间转换为线性 RGB 并使用便携式浮点图格式向 resdet 提供增加精度结果的示例:
convert image.png -colorspace RGB pfm:- | resdet -t image/x-portable-floatmap -
视频
对于压缩视频静帧,选择具有低量化器的高度详细的关键帧可以获得最佳结果。对于具有色度子采样的视频,单帧 yuv4mpeg 流优于 png 截图,因为它保留了色度平面的分离。获取 y4m 帧的一些方法:
FFmpeg/avconv: ffmpeg -i source -ss timestamp -vframes 1 -pix_fmt yuv420p image.y4m
mpv: mpv --start timestamp --frames 1 --vf format=yuv420p -o image.y4m source
通过一起分析多个帧应该可以获得更好的结果。resdet 支持使用 PFM、mjpegtools (y4m) 和 MagickWand 图像加载器进行此操作。要在上述示例中获取多个帧,只需将 FFmpeg 的 -vframes
或 mpv 的 --frames
参数替换为所需的帧数。请注意,当前帧将批量读取,因此请仅选择视频的一小部分以避免消耗过多内存。这不是固有的限制,可能会发生变化。
JPEG
中度到高度压缩的 JPEG 源往往在输入分辨率的 1/8 倍数处产生假阳性,通常随着质量的降低会出现更多并且排名更高。resdet 目前不会过滤/惩罚此类结果,但可以通过在分析前对图像应用去块滤波器来一定程度上缓解这个问题。
使用 FFmpeg 进行去块的示例:ffmpeg -i source.jpg -vf pp=ha/va image.png
注意事项
resdet 对使用传统方法重采样的图像效果很好,但不适用于较新的基于神经网络的调整大小方法。
如果你认为某些东西可能被放大了,但使用 resdet 没有得到好结果,请安装 spec 并查看绝对值频谱 - 通常可以通过视觉识别。我们之前的示例看起来像这样:
注意从每个维度512像素处开始的实心黑线,表示零交叉。
同样的方法可以用于降采样吗?
没有直接的等效方法。由于降采样本质上会丢失信息,因此可能无法实现。某些频谱特征可能会出现在典型的降采样操作结果中,但作者不知道有什么方法可以可靠地识别或以有意义的方式利用它们。
来源?
查看了太多频谱图。 具体来说,这个项目源于一个尚未发布的图像去重框架,在尝试识别重复项是否是彼此的缩放版本时产生。 虽然存在一些资源使用未指定方法做类似的事情,但我不知道有任何与 resdet 相当的算法或描述类似内容的出版物(如果存在,我很乐意阅读)。