MH304 ответ очень приятный и прямой. В случае, если вы не можете использовать морфологию или размытие, чтобы получить более чистое изображение, попробуйте использовать «Фильтр области». То есть фильтруйте каждый большой объект, который не имеет минимальной площади.
Используйте opencv connectedComponentsWithStats , вот реализация C ++ очень простого c фильтра области:
cv::Mat outputLabels, stats, img_color, centroids;
int numberofComponents = cv::connectedComponentsWithStats(bwImage, outputLabels,
stats, centroids, connectivity);
std::vector<cv::Vec3b> colors(numberofComponents+1);
colors[i] = cv::Vec3b(rand()%256, rand()%256, rand()%256);
//do not count the original background-> label = 0:
colors[0] = cv::Vec3b(0,0,0);
//Area threshold:
int minArea = 10; //10 px
for( int i = 1; i <= numberofComponents; i++ ) {
//get the area of the current blob:
auto blobArea = stats.at<int>(i-1, cv::CC_STAT_AREA);
//apply the area filter:
if ( blobArea < minArea )
{
//filter blob below minimum area:
//small regions are painted with (ridiculous) pink color
colors[i-1] = cv::Vec3b(248,48,213);
}
}
Используя фильтр области, я получаю этот результат на вашем самом шумном изображении:
** Дополнительная информация:
По сути, алгоритм выглядит следующим образом:
Передача двоичного изображения в connectedComponentsWithStats . Функция рассчитает количество подключенных компонентов, матрицу меток и дополнительную матрицу с статистикой - включая область BLOB-объектов.
Подготовьте цветовой вектор размером « numberOfcomponents ”, это поможет визуализировать капли, которые мы на самом деле фильтруем. Цвета генерируются случайным образом с помощью функции rand . В диапазоне от 0 до 255, 3 значения для каждого пикселя: BGR.
Учтите, что фон окрашен в черный цвет, поэтому игнорируйте этот «связанный компонент» и его цвет (черный).
Установите порог области. Все капли или пиксели ниже этой области будут окрашены (смешно) в розовый цвет.
L oop через все найденные подключенные компоненты (BLOB-объекты), извлеките область для текущего BLOB-объекта через матрицу статистики и сравните ее с пороговым значением области.
Если область находится ниже порога, закрасьте шарик розовым (в данном случае, но обычно вам нужен черный).