裁剪以排除参差不齐的边缘上的任何透明度

Posted

技术标签:

【中文标题】裁剪以排除参差不齐的边缘上的任何透明度【英文标题】:Crop to exclude any transparency on a ragged edge 【发布时间】:2021-09-07 13:36:27 【问题描述】:

我有一个边缘参差不齐的方形图像:图像外部的透明像素在某个未知范围内向图像中心“编织”进出。此范围可能因各方而异。

是否有一种算法可以将图像裁剪为尽可能大的尺寸而不会留下透明像素?我可以想到一个迭代的:从中心的一个小裁剪方块开始。如果未检测到透明像素,请重新开始,但将裁剪方块扩大 1 个像素。然后重复。裁剪后检测到透明像素后,返回上一步并保存结果。

【问题讨论】:

我假设“透明度”是一些 alpha 通道,其值小于255!?只需找到 Alpha 通道值为255 的像素的最大矩形。根据语言的不同,这只是几行代码(例如带有 NumPy 的 Python)。如果输出也必须是正方形,也许还需要一些额外的行,但我猜这也不是那么难。 【参考方案1】:

想到一个明显的算法:

找到y* = min_y (x,y) : P(x,y) is transparent ,其中P(x,y) 是坐标(x,y) 处的像素,然后裁剪图像[0,y*](假设图像在底部从零开始,并且透明像素始终出现在图像顶部.)

请注意,此算法有严重的缺点,如果 y* 由于错误的透明像素而恰好与 0 非常接近,您最终将几乎裁剪整个图像。

如果您想要一个更强大的解决方案,我相信您必须将此问题视为优化问题并加以解决,从而允许对一些错误的透明像素进行屏蔽而不是裁剪。适合您的算法将是基于能量的公式,可以使用图形切割来解决。例如,请参阅GrabCut 算法。

如果您了解自己的要求以及您的数据可能造成的影响程度,您可以判断您希望制定解决方案的参与程度,但在这一点上,我强烈建议您澄清解决方案的要求以及解决方案的影响程度你的数据可以得到。

【讨论】:

以上是关于裁剪以排除参差不齐的边缘上的任何透明度的主要内容,如果未能解决你的问题,请参考以下文章

裁剪图像的透明边缘

OpenGL Stencil - 排除透明像素

显示时使图像边缘透明

如何裁剪图像边缘

具有alpha层的PNG图像上的OpenCV边缘检测

使用php从边框中删除透明区域(裁剪透明)