是否存在一种基于像素的区域生长
算法,可以通过根据某个度量
的最小化将像素添加到种子
来提取图像上的特征(分割
)。如果添加某个像素后度量
未得到优化,则可能需要移除该像素(即有可能回溯并返回到前几次迭代中获得的种子
)。
我将进一步解释我的目标:
- 该算法从图像上选定的
中心像素
作为初始种子
开始。 - 之后,分别探索每个
4个邻居
(右
、左
、下
和上
邻居),以查看在所选方向上生长种子是否能优化度量
。 - 一个
邻居像素
可能不会立即优化度量
,即使添加该像素所创建的种子
在未来的迭代中会是最优的。 - 有可能
邻居像素
被添加到种子中但后来被移除,如果所获得的种子
不是最优的。
谁能向我建议一种人工智能
技术(或贪婪方法
),适合解决这类问题?此外,判断添加一个像素是否会优化度量的好标准是什么,即使这可能在未来的迭代中发生?
附注:我已经开始在Python
中实现上述内容,但在确定是否值得探索路径
(邻居像素
)的问题上遇到了困难。目前,我只在种子
产生的误差
相对于度量有所改善(即最小化)时,才尝试添加邻居像素
。然而,即使添加右
或左
邻居时度量
未得到优化,这两个路径
中的一个在未来可能导致最优解(如第三个目标中所解释的)。
回答:
你基本上已经概述了使用这种方法可以得到的最成功的算法。它的成功将在很大程度上取决于你用来添加/移除像素的度量,但有一些方法可以模拟你想要的行为。
定义
我们将要优化的度量称为M
,其中M(R)
是区域R
的度量值,区域R
是一些像素的集合。我假设优化度量将导致M
的最大可能值,但如果目标是最小化M
,这种方法也可以工作。
方法论
这种方法与你最初的概述略有不同,但它应该能满足添加位于从种子出发的非最优路径上的像素和移除对优化没有显著贡献的像素的要求。
我们将从一个种子s
开始,但不是在前进时评估路径,而是将图像中的所有像素(或最大特征尺寸)迭代地添加到我们的区域中。在每一步,我们将根据像素对当前区域的度量改善程度确定像素的值,M(p)
。这与包含该像素的区域的值(M(R)
,其中p
在R
中)不同。而是包含该像素的区域的值与添加该像素之前的区域的值的差异(M(p) = M(R) - M(R') 其中 R = R' + p
)。如果你有能力评估单个像素,你可以简单地使用它来代替。
下一个变化是M(R)
中包含一个正则化参数,该参数根据包含的像素数量对分数进行惩罚:N(R) = M(R) - a * |R|
,其中a
是某个任意正常数,|R|
代表我们区域中的像素数量(基数)。注意:如果目标是最小化M
,则a
应为负数。这将对区域的分数产生影响,如果它包含太多像素,则会降低分数。
最后,在所有像素都被添加到区域中并且N(p)
已为每个像素评估后,我们再次迭代区域。这次我们从最后添加的像素开始,逆向迭代我们的像素集,结束于种子s
。在每次迭代中确定区域的分数N(R)
。如果自上次迭代以来分数N(R)
已降低,则我们移除分数N(p)
最低的像素p
。这应该会使区域中最少数量的像素对分数贡献最大。
其他考虑
如果修剪后剩余的像素位于非连续路径上,你可以运行一个辅助算法来添加相邻的像素。你需要进行测试以确定a
的最佳值,使得保留足够的像素来重建建筑物,但不包括图像中的每个像素。
我的意见(你没问的)
总的来说,我认为你使用更robust的算法如卷积神经网络进行特征分类会更幸运。它们可能会更快,并且肯定比上述算法更准确。