ARTICLE DETAIL

资讯详情

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

OpenCV 扩展图像处理模块 ximgproc 全指南:从边缘检测到超像素的 18 项算法能力

OpenCV 扩展图像处理模块 ximgproc 全指南:从边缘检测到超像素的 18 项算法能力 OpenCV 扩展图像处理模块 ximgproc 全指南从边缘检测到超像素的 18 项算法能力【免费下载链接】opencv_contribRepository for OpenCVs extra modules项目地址: https://gitcode.com/gh_mirrors/op/opencv_contrib本篇技术指南围绕 OpenCV 扩展模块 ximgprocExtended Image Processing 展开系统梳理该模块提供的 18 项核心算法能力——包括结构化森林边缘检测、Edge Boxes、各类边缘保持滤波、超像素分割、图分割、选择性搜索、Fast Line Detector 以及基于行程编码的形态学运算等。读者读完本文将掌握 ximgproc 的模块全景、每项算法的适用场景、关键参数含义并能结合仓库中的示例程序与源码实现快速上手实战。模块定位imgproc 之外的第二块图像处理拼图ximgproc 是 OpenCV 官方扩展仓库opencv_contrib中的扩展图像处理模块其头文件入口为 modules/ximgproc/include/opencv2/ximgproc.hpp。与核心模块 imgproc 不同ximgproc 汇集的是“现代”图像处理算法它们大多来自近年发表的学术论文强调边缘感知、结构保持与高效计算。从模块头文件的defgroup声明见 ximgproc.hpp可以看出官方将这些功能划分为多个子组结构化森林边缘检测、EdgeBoxes、滤波器、超像素、图像分割、快速直线检测、Edge Drawing、傅里叶描述子、行程编码形态学等。模块 READMEmodules/ximgproc/README.md列出的 18 项能力如下类别算法典型用途边缘检测Structured Forests对纹理鲁棒的边缘检测优于 Sobel目标候选Edge Boxes基于边缘的候选框生成滤波Domain Transform Filter、Guided Filter、Adaptive Manifold Filter、Joint Bilateral Filter边缘保持平滑、视差/深度图上采样超像素SuperpixelsSLIC / SLICO / MSLIC / LSC / SEEDS图像预分割、区域级特征计算分割Graph segmentation、Selective search from segmentation图像分割与候选区域提议边缘检测Paillou Filter、Fast Line Detector、Deriche Filter、Ridge Detection Filter线、脊线、边缘检测归一化Pei Lin Normalization光照归一化形态学Binary morphology on run-length encoded images大结构元素快速形态学形状检测Ellipse Detector椭圆检测这些算法对应的 C 头文件均位于 modules/ximgproc/include/opencv2/ximgproc/实现位于 modules/ximgproc/src/示例程序位于 modules/ximgproc/samples/。边缘检测结构化森林Structured Forests算法原理与特点结构化森林边缘检测Structured Forests for Fast Edge Detection是该模块的招牌功能对应论文 Dollar Zitnick 2013[P. Dollar and C. L. Zitnick, 2013]。与传统边缘检测算子不同结构化森林属于结构化方法——它会考虑自然图像中像素之间的亲和性affinity因此在纹理丰富的场景下远优于 Sobel 等基础算子。模块头文件将其描述为该类算法对纹理的鲁棒性更强见 structured_edge_detection.hpp源码中官方对 EDEdge Drawing的说明也体现了这一代边缘算法的共同取向采用加法策略逐个选取边缘像素并连接成段而非像 Canny 那样先做梯度滤波再通过非极大值抑制与滞回阈值删减非边缘像素见 ximgproc.hpp。核心 API 与检测流程结构化边缘检测的核心类是cv::ximgproc::StructuredEdgeDetection通过工厂函数创建PtrStructuredEdgeDetection createStructuredEdgeDetection( const String model, Ptrconst RFFeatureGetter howToGetFeatures PtrRFFeatureGetter());其中model是训练好的森林模型文件路径。第一个参数是必需的第二个可选参数用于自定义特征提取器自定义训练时才需要默认传空即可。完整的检测流水线由三个步骤组成API 见 structured_edge_detection.hppdetectEdges输入 RGB 浮点图像值域 [0,1]输出灰度浮点边缘图computeOrientation从边缘图计算每个像素的边缘方向edgesNms基于方向图做非极大值抑制消除边缘宽度得到细化的单像素边缘。edgesNms的参数说明参数默认值含义r2NMS 抑制半径s0边界抑制半径m1保守抑制的乘数isParalleltrue是否启用并行计算运行官方示例仓库提供了完整的可运行示例 modules/ximgproc/samples/structured_edge_detection.cpp其命令行参数为-i输入图像、-m模型文件、-o输出图像。核心调用序列如下// 1. 读取彩色图像并转换为 [0,1] 浮点 Mat image imread(inFilename, IMREAD_COLOR); image.convertTo(image, DataTypefloat::type, 1/255.0); // 2. 创建检测器需模型文件 PtrStructuredEdgeDetection pDollar createStructuredEdgeDetection(modelFilename); // 3. 检测边缘 Mat edges; pDollar-detectEdges(image, edges); // 4. 计算方向图并做 NMS 细化 Mat orientation_map; pDollar-computeOrientation(edges, orientation_map); Mat edge_nms; pDollar-edgesNms(edges, orientation_map, edge_nms, 2, 0, 1, true);示例运行方式模型文件需要从 opencv_extra 仓库获取model.yml.gz./structured_edge_detection -i input.jpg -m model.yml.gz -o edges.png示例的运行结果对比图原图、Sobel 边缘、随机森林边缘三栏对比如下官方在预测教程 modules/ximgproc/tutorials/prediction.markdown 中特别提示Sobel 与StructuredEdgeDetection::detectEdges产生的边缘图都可以进一步应用 Canny 式二值化技术。完整示例图片对比可在该教程的 images 目录中查看 01~12 号图。自定义模型训练从 Matlab 到 OpenCV 的完整链路ximgproc 不仅提供现成模型的推理还支持用户使用作者原始 Matlab 实现训练自己的森林官方训练教程位于 modules/ximgproc/tutorials/training.markdown。整个训练流程分为八个步骤准备依赖下载 Piotrs Toolbox 放入独立目录如PToolbox准备数据集下载 BSDS500 数据集放入名为BSR的目录将两个目录及其子目录加入 Matlab 路径下载检测器代码从微软研究院获取结构化森林 Matlab 实现放入根目录此时目录结构应为. BSR PToolbox models private Contents.m edgesChns.m edgesDemo.m edgesDemoRgbd.m edgesDetect.m edgesEval.m edgesEvalDir.m edgesEvalImg.m edgesEvalPlot.m edgesSweeps.m edgesTrain.m license.txt readme.txt备份默认模型将models/forest/modelFinal.mat重命名为modelFinal.mat.backup修改特征提取打开edgesChns.m注释第 26–41 行并追加两行以使用自定义特征shrinkopts.shrink; chns single(getFeatures( im2double(I) ));编写并编译 MEX 特征提取器核心是实现cv::RFFeatureGetter接口该接口的完整签名见 structured_edge_detection.hppclass NewRFFeatureGetter : public cv::RFFeatureGetter { public: NewRFFeatureGetter() : name(NewRFFeatureGetter){} virtual void getFeatures(const cv::Mat src, NChannelsMat features, const int gnrmRad, const int gsmthRad, const int shrink, const int outNum, const int gradNum) const { // 在此实现特征提取输出应为 n 通道浮点矩阵 } protected: cv::String name; };getFeatures的各参数对应训练选项gnrmRad为梯度归一化半径、gsmthRad为梯度平滑半径、shrink为收缩倍数、outNum为输出通道数、gradNum为梯度方向数。编译后运行edgesDemo需等待数小时新模型会生成在models/forest/下转换模型格式Matlab 二进制格式需转换为 OpenCV 可用的 YAML运行仓库提供的脚本opencv_contrib/ximgproc/tutorials/scripts/modelConvert(model, model.yml)脚本位于 modules/ximgproc/tutorials/scripts/modelConvert.m。训练完成后使用扩展构造函数加载自定义模型与特征提取器cv::StructuredEdgeDetection pDollar cv::createStructuredEdgeDetection( modelName, makePtrNewRFFeatureGetter() );候选框生成Edge BoxesEdge Boxes 是一种基于边缘的目标候选框object proposal生成算法核心思路是边缘密度高且分布紧凑的区域更可能是完整物体。它利用结构化森林的边缘图计算每个候选框的边缘得分输出一系列可能包含目标的矩形区域常用于目标检测的候选区域预筛可以大幅减少后续分类器需要扫描的窗口数量。相关实现位于 modules/ximgproc/src/edgeboxes.cppAPI 定义在 edgeboxes.hpp。仓库提供演示程序 edgeboxes_demo.cpp 与 edgeboxes_demo.py。边缘保持滤波家族滤波是 ximgproc 中算法最密集的类别全部围绕一个目标在平滑噪声的同时保持图像边缘结构。这组滤波器的共同特点是边缘感知edge-aware它们在滤波时会参考引导信息通常是原图避免跨边缘的模糊。各类滤波器一览滤波器核心特点实现文件Domain Transform Filter基于域变换的实时边缘保持滤波src/domain_transform.cppGuided Filter引导滤波O(N) 复杂度支持视差图引导上采样src/guided_filter.cppAdaptive Manifold Filter自适应流形滤波擅长高维数据实时处理src/adaptive_manifold_filter_n.cppJoint Bilateral Filter联合双边滤波经典边缘保持方法src/joint_bilateral_filter.cppEdge Preserving Filter实时去噪同时处理高斯噪声与椒盐噪声src/edgepreserving_filter.cppRolling Guidance Filter滚动引导滤波尺度感知src/rolling_guidance_filter.cppWeighted Median Filter加权中值滤波src/weighted_median_filter.cpp这些滤波器共享公共的 CPU/OCL 基础设施见 src/edgeaware_filters_common.hpp并在 src/dtfilter_cpu.hpp、src/fbs_filter.cpp快速双边等文件中提供针对特定滤波器的加速实现。实战示例edgePreservingFilter以模块新增的实时边缘保持去噪滤波器为例其 API见 edgepreserving_filter.hpp为void edgePreservingFilter( InputArray src, OutputArray dst, int d, double threshold );src8 位 3 通道输入图像d滤波邻域直径必须大于等于 3threshold区分噪声/离群点与真实数据的阈值。该方法源自 Reich 等人的实时边缘保持去噪论文VISIGRAPP 2018能同时平滑高斯噪声与椒盐噪声。可运行示例见 edgepreserving_filter_demo.cpp。超像素分割SLIC / SLICO / MSLIC超像素将图像划分为语义上连贯的像素块是目标检测、分割、显著性检测等任务的重要预处理步骤。ximgproc 提供了 SLIC 及其两个优化变体相关实现文件包括 src/slic.cpp、src/lsc.cppLSC 超像素与 src/seeds.cppSEEDS 超像素。SLIC 系列 APISLICSimple Linear Iterative Clustering通过像素通道与图像平面空间的联合聚类高效生成紧凑、近似均匀的超像素。三种算法变体枚举定义见 slic.hpp变体值说明SLIC100基础 SLIC单一紧凑性参数SLICO101零参数 SLIC自适应紧凑性因子MSLIC102流形 SLIC对内容更敏感创建与使用// 创建algorithm 默认 SLICOregion_size 为平均超像素尺寸像素 // ruler 控制超像素平滑度/紧凑性 PtrSuperpixelSLIC superpixel createSuperpixelSLIC(image, SLICO, 10, 10.0f); // 迭代计算分割迭代次数越高结果越好 superpixel-iterate(10); // 获取标签图CV_32SC1取值 [0, getNumberOfSuperpixels()] Mat labels; superpixel-getLabels(labels); // 获取边界掩码-1 表示超像素边界 Mat mask; superpixel-getLabelContourMask(mask); // 强制标签连通性合并过小区域min_element_size 为百分比默认 25 superpixel-enforceLabelConnectivity(25);官方文档建议对彩色图像先用 3×3 小核做轻微高斯模糊并转换到 CIE Lab 色彩空间可获得更佳的超像素结果。可运行示例见 slic.cpp。图像分割与选择性搜索图分割Graph Segmentation基于图的图像分割算法将图像视为图结构通过合并相似区域实现分割。实现位于 src/graphsegmentation.cppAPI 在 segmentation.hpp示例为 graphsegmentation_demo.cpp。选择性搜索Selective Search选择性搜索从分割结果出发通过多尺度、多样化的区域合并策略生成目标候选区域region proposals是经典目标检测框架如早期 R-CNN 系列的候选区域来源。实现位于 src/selectivesearchsegmentation.cppAPI 同样在 segmentation.hpp示例为 selectivesearchsegmentation_demo.cpp 与 Python 版 selectivesearchsegmentation_demo.py。直线与边缘检测FLD、Paillou、Deriche、Ridge、Ellipse这一组算法聚焦几何特征的提取与验证算法功能头文件 / 实现Fast Line Detector (FLD)快速直线检测fast_line_detector.hpp / src/fast_line_detector.cppPaillou Filter保边去噪滤波可推导梯度paillou_filter.hpp / src/paillou_filter.cppDeriche Filter各向异性平滑与梯度deriche_filter.hpp / src/deriche_filter.cppRidge Detection Filter脊线检测ridgefilter.hpp / src/ridgedetectionfilter.cppEdge Drawing几何特征提取线、圆、椭圆edge_drawing.hpp / src/edge_drawing.cppEllipse Detector椭圆检测find_ellipses.hpp / src/find_ellipses.cpp其中 Edge DrawingED值得专门说明它是主动式proactive边缘检测方法——不靠删除非边缘像素而是逐个挑选边缘像素并连接成连续的边缘段之后再从边缘段中提取直线、圆、椭圆等高层几何特征。这使其非常适用于需要精确边缘定位与几何形状分析的场景。对应示例程序直线检测 fld_lines.cpp、Edge Drawing edge_drawing_demo.cpp、椭圆检测 find_ellipses.cpp。行程编码形态学Run-Length Morphology这一组功能对二值图像做形态学运算但采用了行程编码run-length表示将水平方向上连续为开on的像素序列合并为一个 run每个 run 用三个量描述——首像素列号、末像素列号与行号。这种表示对含有大面积连续开/关区域的图像如棋盘格极其紧凑但对随机噪声图像则效率不佳见 ximgproc.hpp 的官方说明。行程编码图像存储在标准 OpenCV 图像中单列cv::Point3i数组行数为 run 数加 1首行存放原始未编码图像的尺寸每个 run 的映射为 (x: 起始列, y: 结束列, z: 行)。保留原始图像尺寸是为了在边界处理时与 imgproc 函数保持兼容。使用建议来自模块文档对于cv::MORPH_RECT和cv::MORPH_CROSS结构元素以及小尺寸结构元素imgproc 模块已经很快且 OpenCL 支持良好本模块的行程编码实现更适合大结构元素如cv::MORPH_ELLIPSE或自定义结构元素。仓库提供的对比示例 run_length_morphology_demo.cpp 可以直接比较两种实现的速度差异。视差图后处理边缘感知滤波实战视差图disparity map后滤波是 ximgproc 中应用价值极高的功能官方教程 modules/ximgproc/tutorials/disparity_filtering.markdown 详细讲解了其用法。立体匹配算法尤其面向 CPU 实时优化的 StereoBM在无纹理区域、半遮挡区和深度不连续处容易出错常见的补救策略有两条检测不可靠视差值并置为无效得到半稀疏视差图StereoBM / StereoSGBM 已内置部分此类技术使用边缘感知滤波将视差图边缘与源图像边缘对齐并把高置信度区域的视差值传播到低置信度区域如半遮挡区。处理流水线示例程序为 modules/ximgproc/samples/disparity_filtering.cpp默认流水线设计目标是在 CPU 实时约束下取得最佳质量加载左右视图示例使用 MPI-Sintel 数据集中含大量无纹理区域的挑战性立体对下采样加速缩小视图以加速匹配阶段代价是轻微质量损失追求极致质量时应避免下采样匹配与创建滤波器用 StereoBM 做快速匹配不追求速度时 StereoSGBM 质量更好滤波器实例需要传入 StereoMatchercreateRightMatcher返回的第二个 matcher 用于计算左右两张视差图滤波所需执行滤波将左右视差图与原始未下采样的左视图传入滤波器。注意使用原始分辨率视图引导滤波视差图会被以边缘感知方式自动上采样到原始分辨率可视化getDisparityVis便捷函数用于视差图可视化第二参数为对比度所有视差值乘以该值显示。滤波前后的效果对比如下图左为 StereoBM 原始结果右为下采样匹配 后滤波结果测试数据中对应的原始左右视图与未滤波结果见 ambush_5_left.jpg、ambush_5_right.jpg、ambush_5_bm.png。滤波器的实现位于 src/disparity_filters.cppAPI 定义在 disparity_filter.hpp。其他实用工具除上述主类算法外ximgproc 还提供了一批小而实用的功能功能说明文件Pei Lin 归一化光照归一化src/peilin.cpp、peilin.hpp傅里叶描述子形状描述与匹配fourier_descriptors.hpp、src/fourier_descriptors.cpp快速霍夫变换直线/圆检测加速fast_hough_transform.hpp、src/fast_hough_transform.cppRadon 变换投影重建radon_transform.hpp、src/radon_transform.cpp稀疏匹配插值稀疏光流/视差插值sparse_match_interpolator.hpp、src/sparse_match_interpolators.cppNiblack 类阈值局部自适应二值化Niblack/Sauvola/Wolf/NICKximgproc.hpp、src/niblack_thresholding.cppThinning二值骨架化Zhang-Suen / Guo-Hallximgproc.hpp、src/thinning.cpp各向异性扩散Perona-Malik 各向异性扩散ximgproc.hpp、src/anisodiff.cpp其中 Niblack 类局部二值化支持四种方法LocalBinarizationMethods方法说明BINARIZATION_NIBLACK默认经典 Niblack阈值 邻域均值 − k × 邻域标准差BINARIZATION_SAUVOLASauvola 方法需额外参数 r标准差动态范围默认 128BINARIZATION_WOLFWolf 方法BINARIZATION_NICKNICK 方法niBlackThreshold的核心参数blockSize为计算阈值的邻域尺寸3、5、7…k为用户可调系数Niblack 通常取 0~1 之间乘以标准差并从均值中减去。示例见 niblack_thresholding.cpp。Thinning 骨架化支持 ThinningTypes 中定义的 Zhang-Suen 与 Guo-Hall 两种算法默认 Zhang-Suen示例为 thinning.cpp。模块文件结构速查头文件公共 APImodules/ximgproc/include/opencv2/ximgproc/共 25 个主题头文件统一由 ximgproc.hpp 汇总导出实现modules/ximgproc/src/含各算法的 CPU 实现、OpenCL 内核src/opencl/与公共滤波基础设施示例modules/ximgproc/samples/覆盖本指南介绍的绝大多数算法教程modules/ximgproc/tutorials/含结构化森林预测/训练、视差图后滤波三篇官方教程测试与性能基准modules/ximgproc/test/、modules/ximgproc/perf/构建模块通过 modules/ximgproc/CMakeLists.txt 集成到 OpenCV 构建体系中作为扩展模块需要在使用 CMake 配置 OpenCV 时开启OPENCV_EXTRA_MODULES_PATH并指向包含本模块的 contrib 仓库目录。小结ximgproc 作为 OpenCV 的扩展图像处理模块覆盖了从底层滤波到高层几何特征提取的完整算法谱系结构化森林提供了对纹理鲁棒的现代边缘检测边缘保持滤波家族支撑实时去噪与视差图精化SLIC 系列超像素与图分割/选择性搜索构成了区域分析的基础设施而行程编码形态学与各类几何检测器则补足了特定场景下的性能与功能需求。无论是研究原型还是工程落地都可以在 modules/ximgproc/README.md 所列算法清单的基础上结合本仓库的示例程序与源码快速验证并集成。【免费下载链接】opencv_contribRepository for OpenCVs extra modules项目地址: https://gitcode.com/gh_mirrors/op/opencv_contrib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表