我正在开发一个项目,使用 OpenCV 3.3 处理如下图所示的大理石板图像。
可以在https://1drv.ms/f/s!AjoScZ1lKToFheM6wmamv45R7zHwaQ上找到更多我正在处理的具有不同大理石纹理和尺寸的样本
要求是:
- 将大理石板与背景分开并移除背景(填充白色),以便只显示板。
- 计算平板的面积(相机到大理石平板的距离和镜头的参数已知)
我使用的策略是:1)找到大理石板的轮廓,2)删除不在轮廓内的部分,3)获取轮廓的面积大小,4)计算其物理面积。
板坯的轮廓如下图红色所示(这是手工完成的)。
我尝试了几种方法在图像中找到板的轮廓,但由于背景复杂,大理石纹理丰富,未能达到令人满意的效果。
我正在使用的处理逻辑是:将图像转换为灰色并对其进行模糊处理并使用Canny查找边缘,然后使用findContours查找轮廓,代码如下:
Mat img = imread('test2.jpg', 1);
Mat gray, edge;
cvtColor(img, gray, COLOR_BGR2GRAY);
blur(gray, gray, Size(3, 3));
Canny(gray, edge, 50, 200, 3);
vector<vector<Point> > contours;
vector<Vec4i> lines;
findContours(edge, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
cout << "Number of contours detected: " << contours.size() << endl;
vector<Vec4i> hierarchy;
for (int i = 0; i < contours.size(); i++)
{
drawContours(img, contours, i, Scalar(0, 0, 255), 1, 8, hierarchy, 0, Point());
}
imshow("Output", img);
我尝试为数十种组合调整模糊和 Canny 参数,但仍然失败。我还尝试使用 HoughLinesP 找到具有几组不同参数的板的边缘,但也没有这样做。
我是计算机视觉的新手,我现在的问题是:
- 我是否正在寻找错误的方法或策略来找到平板轮廓?有没有更好的算法或组合?还是我需要专注于调整 Canny/findContours/HoughLinesP 算法的参数?
- 由于背景复杂,这种图像真的很难处理吗?
我愿意接受任何可以帮助我完成目标的建议。先感谢您。