为图像添加黑色边框而不会降低质量



我有一个分辨率为 21x9 的 1920:816 图像,我想在顶部和底部添加黑条,以便将其与分辨率为 1920x1080 的图像进行映射。我为此尝试了 2 种解决方案,一种使用 OpenCV,另一种使用 Pillow 中的图像。但是,这两者都降低了图像质量。

未编辑的图像使用VapourSynth和FFMS2从视频文件中获取。

文件比较:(1920x816 帧.png和 1920x1080 帧.png不是编辑文件(

https://diff.pics/rKVbxTRRPG35

我是否缺少一些防止质量损失的重要选项?还是我应该为此使用不同的库?

我用于OpenCV的代码:

import cv2
img = cv2.imread('1920x816 frame.png')
color = [0, 0, 0]
top, bottom, left, right = [132, 132, 0, 0]
img_with_border = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)
cv2.imwrite("1920x1080 after OpenCV.png", img_with_border)

对于枕头:

from PIL import Image, ImageOps
old_im = Image.open("1920x816 frame.png")
new_im = ImageOps.expand(old_im, border=(0, 132))
new_im.save("1920x1080 after Pillow.png", "PNG")

看起来没有质量差异。但是图像文件之间的伽玛值存在差异。您的原始图像以 gamma 0.45455 保存,处理后的图像保存时没有 gamma 值。

以下是 gamma 在 png 文件中的含义的说明:https://hsivonen.fi/png-gamma/

最好只是从两个图像中去除伽马值。Pillow 没有提供任何处理伽马元数据的简单方法,我不确定 openCV 是否也这样做。

经过一番搜索,我意识到我是个白痴。如果我用 Vapoursynth 拍摄帧,我不妨用它来添加所需的边框。

video = core.std.AddBorders(clip = video, top = 132, bottom = 132, color = [0,0,0])

这样无需任何额外的压缩即可完成工作。也许有人会利用它。

最新更新