Cyp*_*her 2 c++ python opencv image image-processing
我想使用 OpenCV 的函数从 CelebA 图像(1024x1024 大小)转换和对齐检测到的脸部(320x240 大小),cv2.warpAffine
但转换后图像的质量明显低于我尝试在 Photoshop 中手动对齐它时的质量:(左图是由 Photoshop 转换,右图在 OpenCV 中转换)
我使用了 OpenCV 的所有插值技术,但它们的质量都无法与 Photoshop 相媲美。
我正在使用的代码是:
warped = cv2.warpAffine(image, TRANSFORM_MATRIX, (240, 320), flags=cv2.INTER_AREA)
Run Code Online (Sandbox Code Playgroud)
到底是什么问题导致转换后的图像质量如此之低?
如果需要,这里是原始 1024x1024 图像的链接。
您正在对信号进行下采样。
方法总是相同的:
如果你不做低通,你就会出现混叠。你注意到了这一点。混叠意味着采样步骤可能完全错过一些高频分量(边缘/角/点/...),从而产生那些奇怪的伪影。正确重新采样的图像不会完全丢失此类高频特征。
如果您在重采样后进行低通,它不会解决问题,只会隐藏它。损害已经造成了。
如果您对一些强烈对比的线条的规则网格进行下采样,您可以让自己相信这两个方面。尝试交替使用黑白单像素线以获得最佳效果。
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)
这是with的结果M = np.eye(3) * 0.25
(等效缩放):
看来是warpAffine
做不到了INTER_AREA
。这对你来说很糟糕:/
如果您需要使用 OpenCV 进行下采样,并且它是2 的幂,则可以使用pyrDown
. 这会进行低通和抽取……因子为两倍。重复应用会给你更高的力量。
如果您需要任意下采样并且由于某种原因不喜欢INTER_AREA
,则必须GaussianBlur
对输入应用 a 。西格玛需要与比例因子成(反)比例。高斯滤波器的西格玛和所得截止频率之间存在某种关系。如果您不想任意选择一个值,您将需要进行更多调查。查看 的内核pyrDown
,以及它最匹配的高斯西格玛。对于比例因子 0.5 来说,这可能是一个不错的值,其他因素应该成(反)比例。
对于简单的缩小,一个高斯模糊就可以了。对于仿射扭曲和更高的变换,您需要应用低通,以尊重所查找的每个像素的不同比例,因为它们在源图像中的“支持”不再是正方形,甚至可能不是矩形,而是任意四边形!
这适用于下采样。如果您上采样,请不要低通。
归档时间: |
|
查看次数: |
991 次 |
最近记录: |