任务
我有二进制图像,我想提取覆盖非零区域的相对少量的矩形。
我真的不需要最小的集。当然,至少在某些时候找到它不会受到伤害,但非病态病例的平均速度对我来说更为重要。
如果有帮助,您可以将二进制图像视为一组1x1矩形。事实上,这样的设置很容易找到,而且这个解决方案基本上对我有用 - 但是,找到任何较小的设置都会大大加快其他事情的发展。
另一个替代方案(或多或少等同于上述内容,至少从我的观点来看)是将一组任意轮廓(包括孔)作为输入:
相关工作
这个问题已被多次提出并回答;例如,接受的答案here很棒。
甚至还有一个Javascript实现here。
所以问题不在于算法是否存在,或者哪种算法是最优的。
问题
相反,问题是:
鉴于我正在使用C ++和OpenCV,是否有一个实现可以轻松地集成到我的代码中?
更好的是,是否有允许许可的实施?
理想的解决方案
理想情况下,我可以这样做:
const cv::Mat binary_image = ...; // get input image from somewhere
const std::vector<cv::Rect> rects = dissect(binary_image);
或者:
const std::vector<cv::Rect> initial_rects = ...;
const std::vector<cv::Rect> rects = find_small_dissection(initial_rects);
但是,当然不使用OpenCV的解决方案也没问题;来回转换根本没问题。但由于OpenCV已经有了图像类型(cv::Mat
)和矩形(cv::Rect
),因此使用上述定义很方便。
此问题的动机
并不是我不能使用伪代码或Javascript代码,而是开始将其移植到C ++和OpenCV。但是,在我的实现运行无bug之前可能需要一段时间。我更倾向于使用同一时间测试,并可能修复现有的开源实现。如果找不到任何东西,那么我可能需要自己编写代码,但是我可能无法开源结果(因为我正在为我的客户开发商业产品)。