我有一个1920x816分辨率的21:9图像,我想在顶部和底部添加黑条,以便与1920x1080分辨率的图像进行比较。为此,我尝试了两种解决方案,一种是使用OpenCV,另一种是使用枕头图像。然而,这两种方法都降低了图像的质量。
未编辑的图像是使用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)而对于Pillow:
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")发布于 2018-10-10 05:23:44
我的质量看起来没什么不同。但图像文件之间的Gamma值存在差异。原始图像是使用gamma 0.45455保存的,而处理后的图像保存时没有gamma值。
下面解释一下gamma在png文件中的含义:https://hsivonen.fi/png-gamma/
最好只从两幅图像中剥离伽马值。Pillow没有提供任何处理伽马元数据的简单方法,我也不确定openCV是否提供了这样的方法。
发布于 2018-10-10 04:39:03
经过一番寻找,我意识到我是个笨蛋。如果我使用Vapoursynth来获取frame,那么我也可以使用它来添加所需的边框。
video = core.std.AddBorders(clip = video, top = 132, bottom = 132, color = [0,0,0])
这可以在不进行任何额外压缩的情况下完成工作。也许有人会利用它。
https://stackoverflow.com/questions/52728575
复制相似问题