我正在使用精明的边缘检测和寻找轮廓功能(都是 OpenCV)来为分水岭变换创建标记。一切正常,但我对结果不是 100% 满意。原因是缺少一些边缘,因此丢失了重要信息。更详细地说,我得到了一堆窗口(前视图),它们是矩形,在分水岭变换之后,我最终得到了这样的结果:
但我宁愿有漂亮的矩形,它们是完整的,不是向一侧开放的。在保持不规则形状的同时(房子前面的灌木丛,汽车..)有什么想法可以解决这个问题吗?我想过用网格覆盖整个图像,但我不能让它工作。
非常感谢。
这是我的代码:
Mat gray;
cvtColor(im, gray, CV_BGR2GRAY);
// Use Canny instead of threshold to catch squares with gradient shading
Mat bw;
Canny(gray, bw, 0, 100, 5, true);
// Find contours
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours( bw, contours, hierarchy,
CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
// watershed
Mat markers(bw.size(), CV_32S);
markers = Scalar::all(0);
int idx = 0;
int compCount = 0;
for( ; idx >= 0; idx = hierarchy[idx][0], compCount++ ) {
if (fabs(contourArea(contours[compCount])) < min_size )
continue;
drawContours(markers, contours, idx, Scalar::all(compCount+1), 1, 8, hierarchy, INT_MAX);
}
watershed( im, markers );
根据要求,这是原始图像、我想要获取的图像和我的输出:
我想要这样的分割(虽然过度分割并没有什么坏处,我只需要确保,我得到了所有的细节):
虽然我得到这样 的东西:(请忽略颜色,它们对于这个问题并不重要,只是我整个程序的结果)。这只是一个例子,如果你愿意,我可以向你展示更多,也请看一下 etrims 数据集,我所有的图片都来自那里。