2016-05-22 8 views
9

Я ищу хороший способ изолировать воздушный пузырь от следующего изображения. Я использую Visual Studio 2015 и C#.Алгоритм определения размера пузырьков воздуха из изображения

Я слышал о методе водораздела и считаю, что это может быть хорошим решением.

Я попытался реализации решения кода найти здесь: watershed image segmentation

Я не имел большого успеха. Решение имеет проблемы с поиском функций, например: FilterGrayToGray.

Кто-нибудь знает, как это сделать?

Example of Image

+1

Вы пробовали OpenCV (или Emgu CV для .Net ... C#)? возможно, использование некоторых бинарных фильтров с детектором blob должно быть достаточно, чтобы, по крайней мере, обнаружить ваши пузырьки ... –

+0

Итак, я попробовал другой алгоритм, которому нужен OpenCV, но все версии библиотек. Открытое CV доступно. NuGet не работает. – Toster

+1

На codegolf была проблема [http://codegolf.stackexchange.com/questions/40831/counting-grains-of-rice], если это помогает. С помощью [C#] (http://codegolf.stackexchange.com/questions/40831/counting-grains-of-rice) ответ – CSharpie

ответ

4

Вы должны просто обучить Neural network, чтобы распознать части изображения, когда нет пузырей (в примерах групп 16x16 пикселей). Тогда, когда распознавание квадрата не увенчалось успехом, вы делаете всплеск горизонтальных строк развертки, и вы регистрируете, где начинается и заканчивается край. Вы можете точно определить участок пузыря (однако его объем должен учитывать кривизну поверхности, которая возможна, но более жесткая) на изображении. Если у вас есть возможность использовать больше камер, вы можете триангулировать больше участков пузыря и получить точное представление о реальном объеме. В качестве еще одной эвристики, чтобы знать размер пузыря, вы также можете использовать известную пропускную способность тома, поэтому вы знаете, что если в течение интервала времени вы выбрали X литров воздуха, а пузырьки имеют разрезы, определенные в определенной пропорции, вы можете перераспределить общий объем через пузырьки и дальнейшее повышение точности (конечно, вы должны иметь в виду давление, поскольку пузыри на дне бассейна будут меньше).

Show different images tweaked

Как вы видите, вы можете играть с простыми алгоритмами, как гауссова разницей и контрастность для достижения различных результатов качества.

  • На левой фотографии вы можете легко удалить все фоновый шум, однако вы потеряли часть пузырьков. Возможно, вы можете повторно получить пропущенные края пузырьков, используя другое освещение в бассейне.
  • На правой фотографии у вас есть все края пузырьков, но теперь у вас также есть больше областей, которые вам нужно вручную удалить из изображения.

Что касается алгоритма обнаружения краев, вы должны использовать алгоритм, который не добавляет фиксированного смещения к ребрам (например, матрицы свертки или лапласа), для этого я считаю, что разница в гауссове будет лучше.

Сохраните все промежуточные данные, чтобы можно было легко проверить и настроить алгоритм и повысить его точность.

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 
} 

редактирует незавершенный .. попробовать сделать документ себя в то же время, я уже дал достаточно следов, чтобы позволить вам сделать работу, вам просто необходимо базовое понимание простых алгоритмов обработки изображений и использования готовых нейронных сетей.

+0

Как обнаружение края использует то, что кажется лучше, потому что есть некоторый шум (волны, отражение света) Вероятно, лучше всего просто попробовать гауссовское различие и настроить его вручную, чтобы увидеть только края пузырьков. – GameDeveloper

+1

Нейронная сеть необходима, потому что есть обломки без пузырьков (край пула, яркая подсветка), которые должны быть отключены вручную областями или областями, отбрасываемыми NN. Конечно, лучший способ - позиционировать камеру таким образом, чтобы существовал только монохромный синий backgroudn, что бы устранить требование для NN. – GameDeveloper

+0

Можете ли вы дать образец кода этого решения? У меня возникла проблема с решениями импликации той же самой проблемой, которую я должен был решить на C#, и я больше пользователь Delphi. – Toster

1

Для решения приходят на ум:

Решение 1:

Используйте Hough transform for circles.

Решение 2:

В прошлом я также было много проблем с подобными задачами сегментации изображений. В основном я закончил заполнение потоком, которое аналогично алгоритму водораздела, который вы запрограммировали.

Несколько шляпа трюки, которые я хотел бы попробовать здесь:

  • термоусадочных изображение.
  • Используйте цвета. Я замечаю, что вы просто делаете все серое; это мало смысла, если у вас есть темно-синий фон и черные границы.
2

На всякий случай, если вы ищете развлечение - вы можете исследовать Application Example: Photo OCR. В основном вы тренируете один NN для обнаружения пузыря и пробуете его в скользящем окне по изображению. Когда вы его захватываете - вы используете другой NN, который обучен оценке размера пузыря или объема (вы, вероятно, можете измерить поток воздуха для обучения NN). Это не так сложно, как кажется, и обеспечивает очень высокую точность и адаптивность.

P.S. Azure ML выглядит неплохо, как свободный источник всех колоколов и свистков, без необходимости углубляться.

1

Вы хотите изолировать воздушный пузырь на одном изображении или отследить один и тот же воздушный пузырь из потока изображений?

Чтобы изолировать «пузырь», попробуйте использовать матрицу свертки на изображении для обнаружения краев. Вы должны выбрать свертку обнаружения края, основанную на характере изображения. Ниже приведен пример обнаружения края лапласа, выполненного в gimp, однако он имеет прямое отношение к реализации кода.

Laplace edge detection

Это может помочь в выделении края пузырьков.

Если вы отслеживаете тот же пузырь из потока, это сложнее из-за того, что пузырьки искажаются при протекании жидкости. Если частота кадров достаточно высока, было бы легко увидеть отличие от кадра к кадру, и вы можете судить о том, какой пузырь он может быть (основан на позиционной разности). то вам придется сравнивать текущий кадр с предыдущим кадром и использовать некоторый интеллект, чтобы попытаться определить, какой пузырь одинаковый от кадра к кадру. Было бы полезно использовать фидуциар, чтобы помочь дать точку отсчета. Сопло внизу изображения может сделать хороший, поскольку вы можете создать подпись для него (сопло не изменит форму!) И каждый раз проверяйте это. Подписи к пузырям не помогут, так как они могут сильно измениться с одного изображения на другое, так что вместо этого вы будете обрабатывать капли и их вероятное местоположение на изображении с одного кадра на другое.

For more information on how convolution matrices work see here.

For more information on edge detection see here.

Надеется, что это помогает, удачи.