0

我在获取图片中对象的轮廓时遇到问题。

为了删除所有噪音,我使用adjustROI()and Canny()

我也试过erode()and dillate(), Laplacian(), GaussianBlur(), Sobel()... 我什至发现了这个代码片段来锐化图片:

GaussianBlur(src, dst_gaussian, Size(0, 0), 3);

addWeighted(src, 1.5, dst_gaussian, -0.5, 0, dst);

但我的结果总是一样的:我的对象充满了黑白颜色(就像电视屏幕上的噪点),所以不可能用findContours()findContours()找到一百万个轮廓,但不是整个轮廓中的一个)对象。我用drawContours()) 检查这个。

我使用 C++,并将图片加载为灰度 Mat(对于 Canny,它必须是灰度的)。我的对象在每张图片上都有不同的形状,但它总是在图片的中间。

我要么需要找到一种方法来通过图像处理获得更好的彩色对象 - 但我不知道还能尝试什么 - 或者在图像处理后如何用颜色填充对象(没有它的轮廓,因为这是我到底想要什么)。

欢迎任何想法。先感谢您。

4

1 回答 1

0

我找到了一个在大多数情况下都有效的解决方案。我使用概率霍夫变换填充我的对象HoughLinesP()

vector<Vec4i> lines;
HoughLinesP(dst, lines, 1, CV_PI/180, 80, 30, 10);
for(size_t i = 0; i < lines.size(); i++)
{
    line(color_dst, Point(lines[i][0], lines[i][1]), Point(lines[i][2], lines[i][3]), Scalar(0,0,255), 3, 8);
}

这是来自 OpenCV 文档提供的一些示例代码。

在使用一些边缘检测算法(如Canny())后,概率霍夫变换在二进制图片中找到对象。该算法找到线条,如果绘制线条,则表示整个对象。当然,某些参数必须针对某种图片进行调整。

我不确定这是否适用于每张图片或每个物体,但就我而言,它确实有效。

于 2012-08-10T09:33:05.333 回答