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

5

我有一组带有黑色伪像的透明PNG图片,就像这样:

Example image

我正在寻找一种自动清除边框的方法。我尝试简单地掩盖RGB值低于某个阈值的像素,但图像本身也可能包含黑色像素,这些像素也会被过滤掉。我正在使用Python3和opencv3/PIL。
我的问题是:如何去除黑色边缘,同时保留不属于边缘的黑色像素? 编辑:如下面usr2564301所指出的,非常少(如果有的话)的边缘像素是纯黑色的。我仍然需要将它们删除,因此我想使用一些阈值值,并删除与透明像素相邻且满足以下条件的像素:
  • 阈值更暗,
  • 比任何相邻的非透明像素暗至少阈值

1
边缘并不全是黑色的,只有一些像素是。实际上,非常非常少。我甚至点来点去都找不到一个。对于边框上不是黑色、暗色或中等色调,但仍然“比随机相邻像素更暗”的像素,你想要发生什么? - Jongware
好的发现!在这种情况下,我想考虑一些阈值值是有意义的,然后删除像素:1)与透明像素相邻,2)比周围非透明像素中最暗的像素至少暗threshold,或者比纯黑色至少亮threshold - Nee
通常,在二进制模式下无法获取真正的斜杠。 - Kinght 金
1
使用透明通道查找所有对象像素(从中创建掩模)。然后侵蚀该掩模或删除所有具有接近黑色像素值的边界处存在尖锐颜色变化的掩模点。 - Micka
我该如何找到颜色变化?这是我找不到如何执行的解释,而迭代所有像素(然后检查四个或更多的邻居)似乎是不必要的。 - Nee
2个回答

2

尝试提取alpha通道并将其侵蚀几个像素。我用ImageMagick来说明这种技术,因为它更容易,但你也可以用OpenCV做同样的事情:

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

enter image description here


1
这是一个好主意,但它除了绝对边缘像素之外还会移除更多的像素,不是吗? - Nee
哦,我明白了,那就是 Micka 在评论中建议的,多或少。 - Mark Setchell
这更多是一个概念性的答案 - 我不确定它应该看起来像什么。 - Mark Setchell

2
您可以使用以下方法在ImageMagick中消除alpha通道的边缘锯齿:
输入: enter image description here
convert image.png -channel a -blur 0x2 -level 50x100% +channel result.png

enter image description here

如果想要较窄的黑色边框,可以将2调小;如果想要较宽的黑色边框,则将2调大。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接