如何在java中以编程方式删除图像的背景?

问题描述 投票:0回答:1

使用 bufferedImage 或其他东西有没有快速的方法来做到这一点?

目前我的做法:

所有图像均以白色背景为中心。所以左上角的像素始终是白色的。

  • 从左上角像素开始,使其透明。
  • 从这个像素中,查看是否有任何边框像素是白色的,如果有,则将其设为透明。对于每个白色的边界像素,检查该像素边界像素,并对所有连接的像素重复此操作。

这对我来说似乎没问题。但我想知道是否有更好的方法来做到这一点?

java bufferedimage
1个回答
0
投票

但我想知道是否有更好的方法来做到这一点?

据我所知,不。 (事实上,我怀疑可以证明除了你的一般方法之外别无选择。)

但是,您的“对所有连接的像素重复”并未指定您如何执行此操作。明显的替代方案是:

  • 递归深度优先 - 这可能是一个坏主意,因为存在调用堆栈溢出的风险。
  • 广度优先使用尚未处理的白色像素的像素位置队列。这将处理波中的像素,最大队列长度将是最大波“宽度”。

可能还有其他策略。

这个问题类似于洪水填充,可以采用洪水填充算法来做到这一点。请参阅 在 Java 中填充形状的最佳方法(无递归) 以获取一些示例。

© www.soinside.com 2019 - 2024. All rights reserved.