ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Audiveris 页面有效性(Sheet Validity)机制详解:检测、判定与处理

Audiveris 页面有效性(Sheet Validity)机制详解:检测、判定与处理 桌面应用计算机视觉图像处理OCR【免费下载链接】audiverisLatest generation of Audiveris OMR engine项目地址https://gitcode.com/gh_mirrors/au/audiveris点击查看免费下载本指南围绕 Audiveris OMR 引擎的页面有效性Sheet validity机制展开当一本书Book中包含插图页、空白页等非乐谱页面时引擎如何自动识别并标记无效页面用户在交互模式下如何确认、查看和切换页面有效性状态以及无效页面会被如何处理不再转录、导出或打印。读完本文你将掌握有效性状态的检测原理、菜单操作路径、标签颜色语义以及它和页面选择Sheet selection、拆分合并Split and merge工具之间的正确分工。为什么需要页面有效性概念Audiveris 把一本书的每个输入图像都当作一个独立的页面Sheet来处理但输入文件中的所有图像并不一定都是乐谱一本书的扫描件中可能混有插图页、扉页、空白页甚至封面扫描图。如果把这些页面也纳入 OMR 转录流程不但浪费时间还会污染整本书的乐谱合并结果。为此Audiveris 为每个页面维护一个有效性标志validity flag页面要么是valid有效包含可转录的乐谱内容要么是invalid无效不包含乐谱内容。从源码看这个标志被持久化保存在每个页面存根SheetStub的 XML 属性中/** * If true, this boolean signals that the sheet contains no valid music * from OMR point of view. * This occurs mainly at the beginning or the end of a book, where some sheets may be left * blank or contain just illustrations. * Sheet invalidity can generally be detected during the codeSCALE/code step. * By default, this boolean is false and not present in the project XML data. */ XmlAttribute XmlJavaTypeAdapter(type boolean.class, value Jaxb.BooleanPositiveAdapter.class) private boolean invalid;见 SheetStub.java注意一个细节默认情况下该布尔值为false且不会出现在项目的 XML 数据中——也就是说绝大多数正常页面在工程文件里根本不记录有效性字段只有被判定为无效的页面才会写入该标志。自动检测SCALE 步骤如何判定页面无效一般情况下SCALE 步骤足够智能能够检测出页面中staff 素材staff material不足从而从 OMR 的角度判定该页面无效。SCALE 步骤负责分析图像中的黑像素分布估算谱线粗细与线间距interline等关键尺度参数。从 ScaleBuilder.java 的源码可以确认两条具体的失效判定路径找不到有规律的谱线间距combo peak时if (comboPeaks.isEmpty()) { sheet.getStub().invalidate(); throw new StepException(No regularly spaced lines found); }见 ScaleBuilder.java找不到有意义的黑线staff line / beam峰值时if (blackPeaks.isEmpty()) { sheet.getStub().invalidate(); throw new StepException(No significant black lines found); }见 ScaleBuilder.java也就是说当一个页面既没有足够的前景黑像素素材连谱线粗细都无法估算也找不到等间距的谱线结构时SCALE 步骤就会抛出StepException并同时调用stub.invalidate()把该页面标记为无效。插图页、纯文本页、空白页通常都会命中这两条判定中的至少一条。批处理与交互模式两种不同的处理方式有效性标志的落地方式取决于运行模式批处理模式batch引擎直接为页面设置invalid标志无需人工干预。整本书转录时无效页面会被自动跳过。交互模式interactive当 SCALE 步骤检测到页面可能无效时会弹出确认提示询问你是否确认该页面确实无效。这给了你纠错的机会——例如一个版面特殊的乐谱页可能被误判你可以在这一步就纠正它。从源码看交互模式下的手动切换也带有确认环节。BookActions.java 中的toggleSheetValidity动作在真正切换状态之前会先弹出确认对话框displayConfirmation(msg doYouConfirm)只有确认后才调用stub.invalidate()或stub.validate()if (isValid) { stub.invalidate(); if (ViewParameters.getInstance().isInvalidSheetDisplay() false) { controller.removeAssembly(stub); } } else { stub.validate(); }有趣的是当页面被标记为无效且当前设置是不显示无效页签时交互模式还会顺手把该页面的装配assembly即页面视图从界面中移除。查看与切换有效性状态Sheet 下拉菜单如何知道某个页面当前被判定为有效还是无效答案是打开Sheet下拉菜单查看其中的Current status当前状态菜单项该菜单项会显示页面当前的有效性状态valid 或 invalid按下该菜单项即可切换页面的有效性状态——从源码看这个菜单项背后绑定的正是上面提到的toggleSheetValidity动作BookActions.java。切换后会弹出确认框并依据页面当前状态显示不同的确认文案资源文件中分别定义了setSheetInvalid.pattern与setSheetValid.pattern见 BookActions.java。两种状态下页面区域的外观对比如下有效页面无效页面标签颜色一眼识别无效页面除了Current status菜单项之外Audiveris 还提供了视觉提示无效页面的页签tab文字会变色文档描述为红色。从源码看页签颜色的具体实现位于StubsController.markTab(...)颜色定义在 Colors.javapublic static final Color SHEET_INVALID Color.PINK; public static final Color SHEET_OK Color.BLACK;即有效页签使用黑色无效页签使用**粉色PINK**标记SheetStub.java 中的invalidate()方法在 GUI 模式下也会立即调用StubsController.getInstance().markTab(this, Colors.SHEET_INVALID)刷新标签颜色无需重启即可看到变化。界面下方各书页签栏中凡是被标记为无效的页面都会以醒目颜色区分于正常页面。显示或隐藏无效页签View | Display invalid sheets默认情况下无效页面可能被隐藏也可能显示——这取决于一个视图参数。你可以通过菜单View | Display invalid sheets决定是否显示无效页面的页签。该开关在源码中对应ViewParameters中的invalidSheetDisplay布尔常量ViewParameters.java并提供isInvalidSheetDisplay()/setInvalidSheetDisplay()以及toggleInvalidSheets(...)方法ViewParameters.java 与 ViewParameters.java。StubsController在构建页签时正是依据该开关决定是否过滤无效页面StubsController.javaif (ViewParameters.getInstance().isInvalidSheetDisplay()) { // Display all sheets for all books, including invalid ones } else { // Hide invalid sheets for all books }在你将某个页面标记为无效后如果当前设置是隐藏无效页签交互模式还会立即把该页面装配从界面移除见上文toggleSheetValidity的代码。无效页面的处理影响什么都不做被声明为invalid的页面不再被处理不转录no transcription不导出no export不打印no printing什么都不做除非你后来意识到判断有误决定把它重新置回valid。这个处理时过滤无效页面的行为在源码中得到广泛印证。例如 Book.java 的getValidSelectedStubs()会从当前选中的页面中剔除所有无效页面只保留stub.isValid()为真的页面getValidStubs()Book.java同样只返回有效的页面存根。而在 Book.java 的createScores(...)中无效、未选中或尚未处理的存根都会触发乐谱分段score break从而保证无效页面不会混入成品的乐谱数据。重要副作用切换有效性会清空 OMR 数据有效性应当如实反映页面在 OMR 视角下的真实状态不要用它来人为地包含或排除某个页面的处理。一个重要的原因是修改页面有效性状态的一个副作用是该页面的所有 OMR 数据会被清空nullify从源码看invalidate()不只是翻转一个布尔值它还会做一连串清理动作SheetStub.javapublic void invalidate () { invalid true; doneSteps.removeIf( (s) - s.compareTo(OmrStep.BINARY) 0); pageRefs.clear(); book.updateScores(this); setModified(true); ... }doneSteps.removeIf(...)删除 BINARY 之后的所有已执行步骤记录即此前的 SCALE、GRID、SYMBOLS 等处理成果全部作废pageRefs.clear()清空页面引用book.updateScores(this)同步更新整本书的乐谱结构。反之validate()SheetStub.java会把页面重新置为有效、可处理的初始状态。因此反复切换有效性不是无代价的——每一次切换都可能丢弃该页面已完成的 OMR 成果需要重新处理。正确的工具分工用页面选择或拆分合并来控制处理范围既然有效性标志不应该被当作排除/包含某页面的开关那么当你想控制某本书的处理范围时应该用什么文档明确指出应当改用以下两种机制页面选择机制sheet selection在书籍层面选中/取消选中某些页面被选中的有效页面才会被处理Book.java 的注释也确认了这一点NOTA: Among this selection, only the valid sheets will be processed。拆分合并工具Split and merge更强大可以把一个物理页面拆分为多个逻辑页面或把多个页面合并为一个通过 Split and merge 指南访问入口位于书的拆分合并book split下拉菜单。简单来说有效性回答这个页面是不是乐谱选择机制回答这本我要处理哪些页面两者各司其职不要混用。小结有效性状态由 SCALE 步骤自动判定找不到规律线距或找不到黑线峰值即判无效是 OMR 视角下的页面属性批处理模式下引擎自动设置invalid标志交互模式下弹出确认提示通过Sheet | Current status查看并切换有效性无效页签以粉色/红色醒目标记可用View | Display invalid sheets控制是否显示无效页面不转录、不导出、不打印且切换有效性会清空该页面的全部 OMR 数据需要控制处理范围时请使用页面选择机制或 Split and merge 工具而不是玩弄有效性标志。理解并善用页面有效性机制是保证 Audiveris 对包含插图页、空白页的书本进行高质量批量转录的第一步。赞分享桌面应用计算机视觉图像处理OCR【免费下载链接】audiverisLatest generation of Audiveris OMR engine项目地址https://gitcode.com/gh_mirrors/au/audiveris点击查看免费下载相关推荐OHIF Mode Validity 模式有效性机制详解isValidMode 与 validTags 实战指南OHIF Mode Validity 模式有效性机制详解isValidMode 与 validTags 实战指南 导读 Mode Validity模式有效性医疗健康前端音视频Exposed 1.0 迁移模块检测Module Detection机制与判定规则详解Exposed 1.0 迁移模块检测Module Detection机制与判定规则详解 Exposed 在 1.0.0 版本中引入了 R2DBC 支持并ORM后端数据存储Puppeteer waitForNetworkIdleOptions 详解掌握页面网络空闲等待的判定与控制Puppeteer waitForNetworkIdleOptions 详解掌握页面网络空闲等待的判定与控制 Puppeteer 的 Page.waitFor浏览器控制测试网页爬虫开发工具上一篇ZeroOmega如何快速管理多代理配置的终极指南下一篇5分钟搞定WPS-Zotero插件一键实现学术论文的智能文献引用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表