Предположим, что ваша интенсивность изменится после преобразования в шкалу серого (если нет, просто конвертируйте в другое цветовое пространство, такое как HSV или LAB, а затем просто используйте один из компонентов)
img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Первый , пороговые значения в градациях серого в несколько полос
ret,thresh1 = cv.threshold(img,128,255,cv.THRESH_BINARY)
ret,thresh2 = cv.threshold(img,27,255,cv.THRESH_BINARY_INV)
ret,thresh3 = cv.threshold(img,77,255,cv.THRESH_TRUNC)
ret,thresh4 = cv.threshold(img,97,255,cv.THRESH_TOZERO)
ret,thresh5 = cv.threshold(img,227,255,cv.THRESH_TOZERO_INV)
Значение должно быть проверено вашими фактическими данными. Здесь я просто приведу пример
Очистите сегментированное изображение с помощью медианного фильтра с радиусом больше 9. Я ожидаю некоторого шума. Вы также можете использовать ROI здесь, чтобы помочь удалить часть шума. Но лично мне лень, я просто написал программу для обработки всех случаев и угла
threshholed_images_aftersmoothing = cv2.medianBlur(threshholed_images,9)
Каждая полоса будет соответствовать одному цвету (слою). Теперь у вас должно быть N сегментированного изображения из одного источника. где N - количество слоев, которые вы хотите отслеживать
Секунда Используйте ограничивающий прямоугольник функции opencv, чтобы найти местоположение и ширину / высоту каждого слоя АКА каждый threshholed_images_aftersmoothing . Например. Граничная привязка на каждом подсегментированном изображении.
C++: Rect boundingRect(InputArray points)
Python: cv2.boundingRect(points) → retval¶
Last , прямоугольник имеет свойство x, y, height и width. Вы можете использовать простой порядок сортировки для сортировки сверху вниз на основе прямоугольного атрибута x. Запустите хотя бы все vieo, чтобы получить x (слой ID), график высоты и времени.
Rect API
Public Attributes
_Tp **height** // this is what you are looking for
_Tp width
_Tp **x** // this tells you the position of the band
_Tp y
Построив соответствующие высоты (| AB | или | CD |) с течением времени, вы можете получить график, который вам нужен.
Более правильный способ - использовать фильтр Калмана для отслеживания графика положения и высоты, так как я ожидаю, что возникнет какой-то пузырь, который будет влиять на высоту слоев.
Если честно, я не ожидал, что студент-химик будет в этом хорош. Хаха, удачи
Что-то не так, вы можете найти меня здесь или напишите мне, если я не смотрю stackoverflow