我有一个分辨率为1920x816的21:9图像,我想在顶部和底部添加黑条,以便与分辨率为1920x1080的相同图像进行比较。我为此尝试了2种解决方案,一种使用OpenCV,第二种使用Pillow中的Image。但是,这些都降低了图像质量。
未编辑的图像是使用VapourSynth和FFMS2从视频文件中拍摄的。
文件之间的比较:(1920x816 frame.png和1920x1080 frame.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")
答案 0 :(得分:1)
看起来我的素质没有差异。但是,图像文件之间的Gamma值有所不同。原始文件保存为gamma 0.45455,处理后的图像保存为没有gamma值。
以下是伽玛在png文件中的含义的解释:https://hsivonen.fi/png-gamma/
最好只从两个图像中去除伽玛值。 Pillow没有提供任何简单的方法来处理gamma元数据,而且我不确定openCV是否也可以。
答案 1 :(得分:0)
经过一番搜索,我意识到我是个白痴。如果我使用Vapoursynth构图,则最好使用它来添加所需的边框。
video = core.std.AddBorders(clip = video, top = 132, bottom = 132, color = [0,0,0])
无需任何额外压缩即可完成工作。也许有人会利用它。