与 Photoshop 相比,OpenCV Warpaffine 的质量较低

Posted

技术标签:

【中文标题】与 Photoshop 相比,OpenCV Warpaffine 的质量较低【英文标题】:OpenCV's Warp Affine Has Lower Quality Compared to Photoshop 【发布时间】:2021-12-26 12:28:09 【问题描述】:

我想使用 OpenCV 的 cv2.warpAffine 函数从 CelebA 图像(1024x1024 大小)转换和对齐检测到的人脸(320x240 大小),但转换后图像的质量明显低于我尝试手动对齐时的质量Photoshop:(左图用Photoshop转换,右图用OpenCV转换)

我使用了 OpenCV 的所有插值技术,但没有一个在质量上接近 Photoshop。

我使用的代码是:

warped = cv2.warpAffine(image, TRANSFORM_MATRIX, (240, 320), flags=cv2.INTER_AREA)

是什么问题导致转换后的图像质量如此低?

如果需要,这里是原始 1024x1024 图像的Link。

【问题讨论】:

您需要在“抽取”之前过滤掉高频分量。它不会那样做,即使是 lanczos。之前应用适当的高斯模糊。 没有。 抽取之后,损坏已经造成。你不能再解决这个问题了。东西已经从裂缝中掉了下来(采样网格)。你必须抽取之前低通。 我刚刚检查过... 带有 INTER_AREA 的 cv.resize 给出了不错的结果...但是 warpAffine 似乎支持 INTER_AREA。我看到以前人们在使用 warpAffine 和 INTER_AREA 时遇到问题的问题......可能是一个错误。它当然没有记录在案。 ***.com/questions/57477478/… 由于目前没有记录这个“假”INTER_AREA,我已经为它打开了一个问题。 github.com/opencv/opencv/issues/21060 如果您认为您想对文档中的某些更改提出拉取请求,请继续。 【参考方案1】:

问题及一般解决方案

您正在对信号进行下采样。

方法总是一样的:

低通去除高频成分 重新采样/抽取

什么不能做

如果你做低通,你会得到锯齿。你注意到了。混叠意味着采样步骤可能会完全错过一些高频分量(边缘/角/点/...),从而产生那些奇怪的伪影。正确重采样的图像不会完全失去这样的高频特征。

如果您在重采样后进行低通,它不会解决问题,只能隐藏它。伤害已经造成。

如果您对一些由强烈对比的线条组成的规则网格进行下采样,您可以在这两个方面说服自己。尝试交替黑白单像素线以获得最佳效果。

实现

PIL 等库在重采样之前隐式执行低通。

OpenCV 没有(一般来说有点)。即使使用 Lanczos 插值(在 OpenCV 中)也不能跳过低通,因为 OpenCV 的 Lanczos 具有固定系数。

OpenCV 具有 INTER_AREA,这是一个 线性 插值,但它另外对所有像素之间的区域内的所有像素求和角样本(而不仅仅是对这四个角进行采样)。这可以为您省去额外的低通步骤。

这是cv.resize(im, (240, 240), interpolation=cv.INTER_AREA)的结果:

这是cv.warpAffine(im, M[:2], (240, 240), interpolation=cv.INTER_AREA)M = np.eye(3) * 0.25 的结果(等效缩放):

看来warpAffine不能INTER_AREA。这对你来说很糟糕:/

如果您需要使用 OpenCV 进行下采样,并且它是 2 的幂,您可以使用 pyrDown。那就是低通和抽取……两倍。重复应用给你更高的权力。

如果您需要任意下采样并且由于某种原因不喜欢INTER_AREA,则必须将GaussianBlur 应用于输入。 Sigma 需要与比例因子(成反比)成比例。高斯滤波器的 sigma 与产生的截止频率之间存在某种关系。如果您不想任意选择一个值,您将需要进行更多调查。查看pyrDown 的内核,以及它最匹配的高斯西格玛。对于 0.5 的比例因子来说,这可能是一个不错的值,而其他因子应该(成反比)成比例。

对于简单的缩小,一个高斯模糊就可以了。对于仿射扭曲和更高的变换,您需要应用低通以尊重每个被查找的单个像素的不同比例,因为它们在源图像中的“支持”不再是正方形,甚至可能不是矩形,而是任意四边形!

我没说什么?

这适用于向下-采样。如果你向上-采样,不要低通。

【讨论】:

非常感谢。您能否详细说明反比例 Sigma 值对同一张图片的影响,以查看它对缩小图像的影响? 如果您将图片抽取 10 倍,即比例因子 0.1,您需要一个 10 左右的 sigma。如果您抽取 2 倍,即比例因子 0.5,您需要一个 2 左右的 sigma。 网络周围是否有可视化显示正确 Sigma 值对缩小图像的影响?这真的有助于更好地理解它。

以上是关于与 Photoshop 相比,OpenCV Warpaffine 的质量较低的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程200篇206. Photoshop 色阶调整算法

OpenCV 例程200篇207. Photoshop 色阶自动调整算法

OpenCV 例程200篇207. Photoshop 色阶自动调整算法

OpenCV 例程200篇206. Photoshop 色阶调整算法

模仿OpenCV中的“魔杖”photoshop工具

2D 卷积 - 与 opencv 的输出相比,结果错误