Я работаю над проектом, который включает в себя определение объема прозрачной жидкости (или воздуха, если это проще) в ограниченном пространстве. Изображения, с которыми я работаю, представляют собой фоновое изображение контейнера без какой-либо жидкости и изображение переднего плана, которое также может быть пустым в редких случаях, но в большинстве случаев частично заполнено некоторым количеством жидкости.
Хотя это может показаться довольно простым плавным и пороговым подходом, он оказывается несколько более сложным. Я работаю с набором из множества этих пар изображений фонового и переднего плана, и я не могу найти подход, который был бы достаточно надежным, чтобы его можно было применить ко всем изображениям в наборе. Моя работа до сих пор включает в себя сглаживание и пороговое значение изображения, а также применение закрытия, чтобы обернуть его.
bg_image = cv.imread("bg_image", 0)
fg_image = cv.imread("fg_image", 0)
blur_fg = cv.GaussianBlur(fg_image, (5, 5), sigmaX=0, sigmaY=0)
thresholded_image = cv.threshold(blur_fg, 186, 255, cv.THRESH_BINARY_INV)[1]
kernel = np.ones((4,2),np.uint8)
closing = cv.morphologyEx(thresholded_image, cv.MORPH_CLOSE, kernel)
Результаты различаются, вот пример, когда все идет хорошо:
В других примерах все не так хорошо:
Кроме того, я также пробовал:
- Вычитание изображений фона и переднего плана
- Контрастная растяжка
- Выравнивание гистограммы
- Другие методы определения порога, такие как Otsu
Основная проблема заключается в том, что интенсивность пикселей в воздухе и жидкости иногда перекрывается (и в целом довольно низкая контрастность), что приводит к неточным оценкам. Я склоняюсь к использованию грани между жидкостью и воздухом, но я не совсем уверен, как это сделать.
Я не хочу перегружаться информацией, поэтому остановлюсь на этом. Я благодарен за любые предложения и могу предоставить дополнительную информацию, если это необходимо.
РЕДАКТИРОВАТЬ:
Вот несколько примеров изображений, с которыми можно поиграть.