从透明图像中去除黑边伪影

Posted

技术标签:

【中文标题】从透明图像中去除黑边伪影【英文标题】:Removing black edge artifacts from a transparent image 【发布时间】:2018-07-10 10:05:38 【问题描述】:

我有一组透明的 PNG 图像,边缘有黑色伪影,如下所示:

我正在寻找一种自动清理边框的方法。我尝试简单地屏蔽掉某个 RGB 值下的像素,但图像本身也可能包含黑色像素,然后这些像素会被过滤掉。我正在使用 Python3 和 opencv3/PIL。

我的问题是:如何去除黑色边缘,同时保留不属于边缘的黑色像素?

编辑:正如 usr2564301 在下面指出的那样,很少(如果有的话)边缘像素是纯黑色的。我仍然需要删除它们,所以我想使用一些阈值并删除与透明像素相邻的像素并且是:

暗于阈值比任何相邻的非透明像素至少暗阈值

【问题讨论】:

边缘不是全黑的,只有一些像素。 非常非常很少,实际上。点击这里和那里我什至找不到一个。如果边框上的像素不是黑色、深色甚至中等,但仍“比随机相邻像素更暗”,您希望发生什么? 好收获!在这种情况下,我想考虑一些阈值并删除以下像素是有意义的:1)与透明像素相邻,2)至少threshold 比周围的任何非透明像素暗,或至少threshold 比纯黑色更轻。 一般情况下,二进制模式下是无法得到真正的斜线的。 使用透明通道查找所有对象像素(从中创建蒙版)。然后侵蚀该遮罩或移除所有在边界处颜色发生剧烈变化且像素值接近黑色的遮罩点。 如何找到颜色变化?这是我无法找到关于如何做的解释的一件事,并且迭代所有像素(然后检查四个或更多邻居)似乎没有必要。 【参考方案1】:

尝试采用 Alpha 通道并将其侵蚀几个像素。我使用 ImageMagick 来说明该技术,因为这更容易,但您可以使用 OpenCV 做同样的事情:

convert pinkboythingwithcathead.png \( +clone -alpha extract -morphology erode disk:2 \) -compose copy-alpha -composite result.png

【讨论】:

这是个好主意,但它不仅会删除绝对边缘像素,不是吗? 哦,我知道这就是 Micka 在 cmets 中的建议——或多或少。 这更像是一个概念性的答案 - 我不确定它应该是什么样子。【参考方案2】:

您可以在 ImageMagick 中对 alpha 通道的边缘进行抗锯齿,如下所示:

输入:

convert image.png -channel a -blur 0x2 -level 50x100% +channel result.png

如果黑色边框较细,则使用小于 2 的值调整 2,如果黑色边框较宽,则使用大于 2 的值。

【讨论】:

以上是关于从透明图像中去除黑边伪影的主要内容,如果未能解决你的问题,请参考以下文章

ArcGIS风暴ArcGIS栅格影像去除黑边(背景值)方法汇总

ArcGIS风暴ArcGIS栅格影像去除黑边(背景值)方法汇总

视频黑边去除算法(python+opencv)

视频黑边去除算法(python+opencv)

ArcGIS中影像图去黑边

TerraBuilder创建地形之去除影像黑边,填充影像