Вы должны просто обучить Neural network, чтобы распознать части изображения, когда нет пузырей (в примерах групп 16x16 пикселей). Тогда, когда распознавание квадрата не увенчалось успехом, вы делаете всплеск горизонтальных строк развертки, и вы регистрируете, где начинается и заканчивается край. Вы можете точно определить участок пузыря (однако его объем должен учитывать кривизну поверхности, которая возможна, но более жесткая) на изображении. Если у вас есть возможность использовать больше камер, вы можете триангулировать больше участков пузыря и получить точное представление о реальном объеме. В качестве еще одной эвристики, чтобы знать размер пузыря, вы также можете использовать известную пропускную способность тома, поэтому вы знаете, что если в течение интервала времени вы выбрали X литров воздуха, а пузырьки имеют разрезы, определенные в определенной пропорции, вы можете перераспределить общий объем через пузырьки и дальнейшее повышение точности (конечно, вы должны иметь в виду давление, поскольку пузыри на дне бассейна будут меньше).
Как вы видите, вы можете играть с простыми алгоритмами, как гауссова разницей и контрастность для достижения различных результатов качества.
- На левой фотографии вы можете легко удалить все фоновый шум, однако вы потеряли часть пузырьков. Возможно, вы можете повторно получить пропущенные края пузырьков, используя другое освещение в бассейне.
- На правой фотографии у вас есть все края пузырьков, но теперь у вас также есть больше областей, которые вам нужно вручную удалить из изображения.
Что касается алгоритма обнаружения краев, вы должны использовать алгоритм, который не добавляет фиксированного смещения к ребрам (например, матрицы свертки или лапласа), для этого я считаю, что разница в гауссове будет лучше.
Сохраните все промежуточные данные, чтобы можно было легко проверить и настроить алгоритм и повысить его точность.
EDIT:
Код зависит от библиотеки которым вы пользуетесь, вы можете легко реализовать Gaussian Blur и Horizontal ScanLine, для нейронных сетей уже есть в C# решений там. больше
// Do gaussian difference
Image ComputeGaussianDifference (Image img, float r1, float r2){
Image img = img.GaussianBlur(r1);
Image img2 = img.GaussianBlur(r2);
return (img-img2).Normalize(); // make values more noticeable
}
редактирует незавершенный .. попробовать сделать документ себя в то же время, я уже дал достаточно следов, чтобы позволить вам сделать работу, вам просто необходимо базовое понимание простых алгоритмов обработки изображений и использования готовых нейронных сетей.
Вы пробовали OpenCV (или Emgu CV для .Net ... C#)? возможно, использование некоторых бинарных фильтров с детектором blob должно быть достаточно, чтобы, по крайней мере, обнаружить ваши пузырьки ... –
Итак, я попробовал другой алгоритм, которому нужен OpenCV, но все версии библиотек. Открытое CV доступно. NuGet не работает. – Toster
На codegolf была проблема [http://codegolf.stackexchange.com/questions/40831/counting-grains-of-rice], если это помогает. С помощью [C#] (http://codegolf.stackexchange.com/questions/40831/counting-grains-of-rice) ответ – CSharpie