如何消除此图像中的噪音-openCV

时间:2014-04-02 20:55:17

标签: c++ opencv noise

我试图消除此图片中的噪音:

enter image description here

旨在隔离三角形

实际上我有很多这样的画面(有一些噪音的三角形),我不知道如何去除噪音。我希望有一个没有噪音的大三角形来处理它(检测兴趣点)。

我曾尝试侵蚀和所有这些东西,但没有成功。你对我如何改善这个结果有所了解吗?

1 个答案:

答案 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);

enter image description here