我试图消除此图片中的噪音:
旨在隔离三角形。
实际上我有很多这样的画面(有一些噪音的三角形),我不知道如何去除噪音。我希望有一个没有噪音的大三角形来处理它(检测兴趣点)。
我曾尝试侵蚀和所有这些东西,但没有成功。你对我如何改善这个结果有所了解吗?
答案 0 :(得分:2)
随着扩张而腐蚀会扭曲三角形的形状。你可以使用connected components(CC)甚至更好的floodFill并根据区域删除(填充零)(floodFill输出它找到的每个CC的区域)。当然,如果您确定要保留的内容始终是三角形,则可以在擦除噪声之前添加额外的步骤来验证三角形形状。下面的代码找到最大的段,并以红色勾勒出其轮廓。三角形的验证由绿色圆圈表示,并且可以通过查看 approx 向量中的多边形近似来进一步探索。
vector<vector<Point> > contours;
Mat hierarchy, I Icol;
Icol = imread("triang.png");
cvtColor(Icol, I, CV_BGR2GRAY);
// Find connected components (CC)
findContours(I.clone(), contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
// Select the largest CC
int ncontours = contours.size();
int max_sz = 0, max_idx;
for (int i=0; i<ncontours; i++) {
int sz = contours[i].size();
if (max_sz<sz) {
max_sz = sz;
max_idx = i;
}
}
for (int i=0; i<max_sz; i++) {
Point pt = contours[max_idx][i];
Icol.at<Vec3b>(pt.y, pt.x) = Vec3b(0, 0, 255);
}
// Verify triangle
vector<Point> approx;
approxPolyDP(contours[max_idx], approx, 10, true);
cout<<Mat(approx)<<endl;
for (int i=0; i<approx.size(); i++) {
Point pt = approx[i];
circle(Icol, pt, 3, Scalar(0, 255, 0), 2);
}
imshow("largest", Icol); imwrite("triangle.png", Icol);
waitKey(-1);