Я пытаюсь удалить шум на этом изображении:
стремясь изолировать треугольник.
На самом деле у меня много таких картинок (треугольник с некоторым шумом), и я не знаю, как я могу удалить шум. Я хочу иметь большой треугольник без шума, чтобы обработать его (определить точки интереса).
Я пытался разрушить и все эти вещи, но безуспешно. У вас есть идея о том, как я могу улучшить этот результат?
Эрозия с последующим расширением исказит форму ваших треугольников. Ты можешь использовать подключенные компоненты (CC) или даже лучше заливка и удалить (заполнить нулями) в зависимости от области (отладка выводит область каждой найденной CC). Конечно, если вы уверены, что то, что вы хотите сохранить, это всегда треугольники, вы можете добавить дополнительный шаг для проверки треугольной формы перед удалением шума. Код ниже находит самый большой сегмент и выделяет его контур красным цветом. Проверка треугольной формы обозначена зелеными кружками и может быть дополнительно изучена при взгляде на полигональное приближение в приблизительно вектор.
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);
Других решений пока нет …