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

时间:2018-10-09 20:08:07

标签: python image-processing

我有一个分辨率为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")

2 个答案:

答案 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])

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

相关问题