【发布时间】:2018-07-29 09:46:44
【问题描述】:
请注意 - 这本质上是一道数学题。但是,我也标记了 C# 因为这是我正在使用的语言
总结
我正在寻找一种可以在图像中找到负空间(或空间)的算法(或其名称)。我找到的最接近的Dijkstra's algorithm(看起来很接近),但它实际上是实际问题的一个子集。即,通过 笛卡尔平面 遍历每个未填充的坐标(在我的情况下为黑色)以找到蒙版。下面的例子
Dijkstra 算法示例
背景
我需要整理成千上万张包含人工制品的图像。我说的清理是指这些事情:
- 使用边缘检测寻找图像中物体的边缘
- 掩盖 负空间,这样我就可以将图像背景转换为纯白色
- 将图像裁剪到最佳尺寸。
目前我正在使用 Canny 边缘检测 来查找图像中最重要的部分。我可以很好地裁剪图像(如下所示),还可以找到所有有问题的图像。但是,我无法找到最佳算法(或其名称)来找到负空间。
原图示例
如您所见,图像看起来很干净,但实际上并非
突出问题示例
图片背景中有很多伪影,需要移除
Canny 边缘检测示例
这在清理图像方面做得很好
问题
Dijkstra's algorithms 前提是它寻找所有可能的路径,它基本上解决了旅行销售人的问题
问题是;在称重和距离测量方面,该算法实际上比我需要做的要多得多,并且当它具有最短路径(我需要它来完成图像)时它会停止。
伪代码
1 function Dijkstra(Graph, source):
2
3 create vertex set Q
4
5 for each vertex v in Graph: // Initialization
6 dist[v] ← INFINITY // Unknown distance from source to v
7 prev[v] ← UNDEFINED // Previous node in optimal path from source
8 add v to Q // All nodes initially in Q (unvisited nodes)
9
10 dist[source] ← 0 // Distance from source to source
11
12 while Q is not empty:
13 u ← vertex in Q with min dist[u] // Node with the least distance
14 // will be selected first
15 remove u from Q
16
17 for each neighbor v of u: // where v is still in Q.
18 alt ← dist[u] + length(u, v)
19 if alt < dist[v]: // A shorter path to v has been found
20 dist[v] ← alt
21 prev[v] ← u
22
23 return dist[], prev[]
谁能建议一种算法或将伪代码修改为Dijkstra算法来实现这一点?
【问题讨论】:
-
听起来您正在寻找洪水填充算法。 en.wikipedia.org/wiki/Flood_fill
-
@Rotem 我很可能!,我从来没想过
-
如果是这样,对于任何实际情况,您最好使用非递归实现,因为堆栈溢出的风险非常高。
-
@Rotem 谢谢这是个好建议。
标签: c# algorithm math image-processing