增强 grid_graph 和图像上的图形切割

2023-12-29

我正在尝试使用 Boost Graph Library 在 2D 图像上使用图形切割。我的目标是将每个像素表示为具有 4 个浮动边缘(边界较少)的节点。邻域像素的边缘将具有取决于梯度或强度或其他东西的值。

为此,我尝试将 boost::grid_graph 与 boost::boykov_kolmogorov_max_flow() 一起使用,但没有成功。该文档说 grid_graph 模型“顶点列表”、“边列表”和“关联图”,这是 boykov_kolmogorov_max_flow 的要求,所以我认为它应该有效。

这是我的代码:

const unsigned int D = 2;
typedef boost::grid_graph<D> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor VertexDescriptor;

boost::array<unsigned int, D> lengths = { { 3, 3 } };
Graph graph(lengths, false);

// Add edge's value between pixels

VertexDescriptor s, t; // Should be initialized, I know.
float flow = boost::boykov_kolmogorov_max_flow(graph, s, t);
// error C2039: 'edge_property_type' is not a member of 'boost::grid_graph<Dimensions>'

我知道 s 和 t 应该被初始化,但我只想编译程序。是否可以将 grid_graph 与 boykov_kolmogorov_max_flow 一起使用?如果是这样,怎么办?如果没有,那么我想我被迫使用更通用(并且可能更慢)的 boost::adjacency_list?谢谢。


您在另一个答案中遇到的问题可能是由旧版本的 Visual Studio 引起的(其代码与 Visual Studio 2012 Express/g++ 4.8.0 和 boost 1.53.0 正常工作)。如果该问题是您的编译器的唯一问题,则可以通过创建另一个类似于使用的自定义属性映射来轻松回避capacity。所需的更改标记为//ADDED and //CHANGED.

#include <iostream>

#include <boost/graph/grid_graph.hpp>
#include <boost/graph/boykov_kolmogorov_max_flow.hpp>
#include <boost/graph/iteration_macros.hpp>

int main()
{

    const unsigned int D = 2;
    typedef boost::grid_graph<D> Graph;
    typedef boost::graph_traits<Graph>::vertex_descriptor VertexDescriptor;
    typedef boost::graph_traits<Graph>::edge_descriptor EdgeDescriptor;//ADDED
    typedef boost::graph_traits<Graph>::vertices_size_type VertexIndex;
    typedef boost::graph_traits<Graph>::edges_size_type EdgeIndex;


    boost::array<std::size_t, D> lengths = { { 3, 3 } };
    Graph graph(lengths, false);

    float pixel_intensity[]={10.0f,15.0f,25.0f,
                            5.0f,220.0f,240.0f,
                            12.0f,15.0,230.0f};
    std::vector<int> groups(num_vertices(graph));
    std::vector<float> residual_capacity(num_edges(graph)); //this needs to be initialized to 0
    std::vector<float> capacity(num_edges(graph)); //this is initialized below, I believe the capacities of an edge and its reverse should be equal, but I'm not sure
    std::vector<EdgeDescriptor> reverse_edges(num_edges(graph));//ADDED

    BGL_FORALL_EDGES(e,graph,Graph)
    {
        VertexDescriptor src = source(e,graph);
        VertexDescriptor tgt = target(e,graph);
        VertexIndex source_idx = get(boost::vertex_index,graph,src);
        VertexIndex target_idx = get(boost::vertex_index,graph,tgt);
        EdgeIndex edge_idx = get(boost::edge_index,graph,e);

        capacity[edge_idx] = 255.0f - fabs(pixel_intensity[source_idx]-pixel_intensity[target_idx]); //you should change this to your "gradiant or intensity or something"

        reverse_edges[edge_idx]=edge(tgt,src,graph).first;//ADDED
    }

    VertexDescriptor s=vertex(0,graph), t=vertex(8,graph); 

    //in the boykov_kolmogorov_max_flow header it says that you should use this overload with an explicit color property map parameter if you are interested in finding the minimum cut
    boykov_kolmogorov_max_flow(graph,
        make_iterator_property_map(&capacity[0], get(boost::edge_index, graph)), 
        make_iterator_property_map(&residual_capacity[0], get(boost::edge_index, graph)),
        make_iterator_property_map(&reverse_edges[0], get(boost::edge_index, graph)), //CHANGED
        make_iterator_property_map(&groups[0], get(boost::vertex_index, graph)),
        get(boost::vertex_index, graph),
        s,
        t
    );


   for(size_t index=0; index < groups.size(); ++index)
   {
        if((index%lengths[0]==0)&&index)
            std::cout << std::endl;
        std::cout << groups[index] << " ";
   }

   return 0;
}

在 Coliru 上工作。 http://coliru.stacked-crooked.com/view?id=5dfb6672edbad279a31cf2e6949141a7-50d9cfc8a1d350e7409e81e87c2653ba

PS:Boost.Graph 文档未能澄清的一件事是,其中描述的概念要求适用于显式传递每个参数的情况。一些默认参数可能会引入进一步的要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

增强 grid_graph 和图像上的图形切割 的相关文章

  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 重载<<的返回值

    include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 单元测试方法中是否需要总结

    既然单元测试方法的命名使其目的更有意义 那么单元测试方法是否有必要添加摘要呢 Example
  • 如何将Python字典对象转换为numpy数组

    我有 python dict 对象 其键作为 datetime date 对象 值作为元组对象 gt gt gt data dict datetime date 2006 1 1 5 3 datetime date 2006 1 2 8 8
  • Slim + Twig - 如何在开发过程中关闭 Twig 缓存?

    这是我将其注入 Slim 容器中的树枝视图 Views and Templates https www slimframework com docs features templates html container view functi
  • PHP:包含和需要文件时抛出错误

    我尝试创建一个引导文件 但是每当我尝试在另一个文件中包含或需要它时 就会不断出现这样的错误 Warning require once folder file php function require once 无法打开流 没有这样的文件或目
  • 快速获取特定路径下的所有文件和目录

    我正在创建一个备份应用程序 其中 c 扫描目录 在我使用类似的方法来获取目录中的所有文件和子文件之前 DirectoryInfo di new DirectoryInfo A var directories di GetFiles Sear
  • 如何通过只输入一个EOF来结束scanf

    我遇到了这个问题 我正在使用 while 循环来扫描数字字符串 需要结束扫描并开始继续程序的其余部分 我只是不知道如何刷新标准输入或做任何事情而不按 Ctrl D 两次 我只需要发送 EOF 一次来告诉我的循环结束 while feof s
  • 仅在弹性项目内阻止元素?

    显然 弹性项目容器内只能有块元素 内联 内联块 浮动没有任何作用 这很奇怪 除非我做得完全错误 否则似乎没什么用 这是笔 http codepen io iaezzy pen GggVxe http codepen io iaezzy pe
  • vim diff 可以使用耐心算法吗?

    有没有办法将vimdiff的diff策略设置为耐心算法 它内置于 git 中 似乎比普通的 diff 好得多 以供参考 如何将耐心设置为默认的 git diff 算法 https stackoverflow com questions 44
  • 转到 Google 表格中的最后一行数据

    我查了一下 发现以下代码将前进到 Google 电子表格中数据的最后一行 至少在我们添加第 297 行之外的更多行之前是这样 function myFunction var ss SpreadsheetApp getActiveSpread
  • 在父元素中使用 jQuery 获取数据属性的值

    我有以下 HTML 代码 其中onclick of spot info我想得到的值data test div class spot div class spot main span Test span a href class spot i
  • 解析 XML HttpResponse

    我正在尝试解析从 HttpPost 到服务器 last fm 的 XML HttpResponse 用于 last fm android 应用程序 如果我简单地将它解析为字符串 我可以看到它是一个普通的 xml 字符串 包含所有所需的信息
  • Deploy:capistrano 上的符号链接将“当前”目录指向以前的版本

    我正在使用 capistrano 部署我的 Ruby on Rails 项目 我使用的是 Dreamhost VPS 从几周前开始 在 capistrano 或乘客没有任何变化的情况下 我开始在部署中遇到一个奇怪的问题 每次 capistr
  • “navigator.app”文档在哪里?

    我只看到那个navigator appCordova 应用程序中的对象有一些有用的方法 但它们有记录吗 这似乎是一个特定于平台的 API 有意未记录在案 2012 年初开出了一张票 结论是 由于它是非官方的且特定于平台 因此它将保持未记录状
  • 如何关闭“限定符‘this’。” Resharper 中的警告是多余的吗?

    在我的代码中有很多this 限定符 编写 Python 代码的习惯 所以我在右手边的槽中有很多橙色的小警告标记 上面写着 限定符 this 是多余的 我不想删除this 预选赛 如何关闭橙色警告标记 For 锐锐器 9它已被移动 实际上我从
  • 如何使用 PHP 最好使用 SimpleXML 附加到 XML 文件

    我有一个 XML 文件 如下所示
  • R:更改plot_ly中的字体大小

    我一直在尝试更改我的标签上的尺寸x and y使用绘制的图表的轴plot ly in R 下面是我的代码 q lt plot ly x colnames avg exp norm y row names avg exp norm z avg
  • 编辑器模板/显示模板如何识别分配给它们的任何属性?

    我想添加一个 Required 归因于我的DateTime编辑器模板 以便我可以添加适当的验证方案或DataType Date属性 这样我就知道什么时候应该只显示日期 但我不知道如何获取元数据 该元数据说明编辑器模板已分配给它的属性 内置属
  • 对齐音频以便使用网络音频 api 流畅播放

    我目前正在尝试弄清楚如何使用网络音频 API 播放分块音频 一切都正常 但是 大多数块之间的转换并不像我希望的那样顺利 有一个非常非常短暂的时刻大多数人之间保持沉默 我当前的加载和播放代码 const response await fetc
  • 快速会话 cookie 隐藏在哪里?

    My express session正在工作 我用非常短的 cookie max age 10 秒 对其进行了测试 它按预期工作 app use session secret xxx resave false saveUninitializ
  • 增强 grid_graph 和图像上的图形切割

    我正在尝试使用 Boost Graph Library 在 2D 图像上使用图形切割 我的目标是将每个像素表示为具有 4 个浮动边缘 边界较少 的节点 邻域像素的边缘将具有取决于梯度或强度或其他东西的值 为此 我尝试将 boost grid