我的图像显示两个圆圈共享相同的中心但具有不同的半径 - 内圈和外圈。我需要检查一下,如果这两个圆圈“断裂”,那就意味着,如果圆圈的形状有些磨损或破损。
圆圈总是具有相同的半径,所以我使用OpenCV的HoughCircles,给定半径为两个圆圈中的每个圆圈,以确定图像是否包含两个圆圈。可以毫无问题地找到圆圈。 我对图像处理相当缺乏经验,所以我想,如果它们的形状完美无缺,那么使用HoughCircles只能找到圆圈,但如果它们是圆形笔划的某些边缘或曲线,HoughCircles也会找到圆圈。
有没有更好的方法来检查,如果两个圆圈完好无损或HoughCircles是完全错误的方式?我用HoughCircles的阈值参数玩了一下,但是当阈值设置得太低时,算法根本找不到圆圈,无论它是完整还是破碎。
编辑:这是一个抽象的图像,可能会更清晰。 http://1drv.ms/1toMHay 内圈破了,外面好了。虽然不应该检测到内部,但HoughCircles可能会检测到两个圆圈。
我的想法是,我有一个完整的两个圆的参考图像,以确定霍夫圆函数的正确半径,阈值和其他参数,以确保,这些是用霍夫圆圈找到的。使用这些参数,应分析其他图像以查看,如果这些图像还包含两个完整的圆圈,或者如果至少一个圆圈看起来像我提供的图像中的内圆。
上传的图片 我上传了一些真实的图片,以便更清楚我想要实现的目标。 http://1drv.ms/1nhJJQ9 这些图像采用两种不同的光线情况,具有直接和间接光。每组都有一个“完整”的图像和一些破碎的图像。现在我必须检测,如果图像是完整的或破碎的,我的第一个方法是,看看两个圆圈是否完好无损或以某种方式磨损。 这些图像甚至是可能的,还是有更好的方法?
答案 0 :(得分:2)
选项1
太过检测是否有圆圈我会坚持使用OpenCV中的houghCircles功能。为了检测它们是否破损/磨损,我建议使用轮廓。
如果您使用OpenCV函数findContours()
,您将获得所有"形状的列表"在你的形象。然后,您可以检查这些轮廓中的任何一个是否符合您的预期标准。圆圈应在contourArea()
和arcLength()
之间保持一致的比率。
使用findContours()
并检查每个轮廓区域的示例:
//Find and draw contours
vector <vector<Point> > contours; // Vector for storing contour
vector<Vec4i> hierarchy;
findContours(binaryImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++) {
float area = contourArea(contours[i], false);
if (area > 300) {
drawContours(inputImage, contours, i, Scalar(0, 0, 255), 2, 8, hierarchy);
}
}
确保使用二进制图像作为输入。此示例在contourArea中以红色绘制了大于300的图像上的所有轮廓。
选项2
您的另一个选择是坚持使用houghCircles()
,但请检查您找到的圆圈周围的像素。如果您从中心点扫描半径范围内的像素并计算二进制图像中有多少像素为白色,则可以创建一个百分比,可以说明您的houghCircle与图像的匹配程度。
您可以通过以下方式检查二进制图像的像素值,您只需要声明只检查圆圈上的像素。
for(int i=0;i<binaryImage.rows;i++) {
for(int j=0;j<binaryImage.cols;j++) {
std::cout << (int)binaryImage.at<uchar>(i,j)<< ",";
}
std::cout << "\n";
}
答案 1 :(得分:0)
正如biqutte所说,有了一些图像,你会得到更好的帮助,但我的想法是,如果你知道半径和中心位置,你可以写一个小函数来评估你可以设置的圆圈上的像素颜色你自己的保证金。你可以使用OpenCV函数cv::Termcriteria
来提高算法的精度。