Определить пиксели, занятые красными частицами на изображении

У меня есть несколько изображений из эксперимента с частицами пластика и волнами воды. Цель состоит в том, чтобы автоматически идентифицировать частицы пластика. Иногда они перекрываются, и мне не нужно находить отдельные частицы, достаточно найти те пиксели, которые содержат пластик.

Поскольку частицы красные, а фон в основном белый или черный, я подумал, что можно пойти на простой порог, сказав, что пиксели являются пластиками, если R > 5*B и R > 0.25, где R и B — красный и синий каналы. Однако экспозиция довольно сильно варьируется в зависимости от эксперимента, а иногда и внутри эксперимента, когда часть поверхности покрыта водой, поэтому мой подход работает не очень стабильно и иногда ошибочно определяет темные трещины по бокам.

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

Примеры изображений:

темные трещины, возможно, придется замаскировать вручную (настройка эксперимента/постобработка). -- Меняется ли освещение во времени в одном эксперименте? установите для управления экспозицией (выдержкой, диафрагмой) вашей камеры значение «фиксированное» — я бы рекомендовал придерживаться черно-белого режима для шаров и фона. цвета обычно более хлопотны, требуют более качественного изображения. - если вы не можете определить это экспериментально, вычитание большого медианного ядра выровняет изображение. вам все равно следует подходить к этому как к пороговому значению или его варианту. opencv — широко используемая библиотека. есть inRange()

Christoph Rackwitz 26.04.2024 07:54

@ChristophRackwitz Освещение не менялось намеренно, но я думаю, что камеры GoPro, которые мы использовали, автоматически регулируют экспозицию, а движущаяся поверхность воды приводит к изменению яркости, например, из-за различий в отражении. Я подумал о том, чтобы замаскировать трещины, но это немного сложно, потому что изменение уровня воды и преломление в воде означают, что их видимое положение может измениться. (Конечно, лучше всего было бы перестроить экспериментальную установку, чтобы избежать трещин.) Спасибо за предложение ``ìnRange()```, я посмотрю на это.

Tor 27.04.2024 08:31

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

Christoph Rackwitz 27.04.2024 11:32

Я предполагаю, что отрицательные голоса связаны с тем, что вам не нужны какие-либо ML или CNN, и вы не указали, что у вас есть веские основания подозревать, что они потребуются здесь. - однако семантическая сегментация могла бы решить эту проблему, если бы для обучения было достаточно аннотированных изображений («достаточно» - где-то между несколькими и намного больше). это была бы легкая задача для простой модели сегментации, достаточно простой, чтобы простая старая обработка изображений уже хорошо ее решила (о чем свидетельствует ответ Марка Сетчелла).

Christoph Rackwitz 27.04.2024 11:34
Оптимизация производительности модели: Руководство по настройке гиперпараметров в Python с Keras
Оптимизация производительности модели: Руководство по настройке гиперпараметров в Python с Keras
Настройка гиперпараметров - это процесс выбора наилучшего набора гиперпараметров для модели машинного обучения с целью оптимизации ее...
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
Определение пород собак с помощью конволюционных нейронных сетей (CNN)
Определение пород собак с помощью конволюционных нейронных сетей (CNN)
В рамках финального проекта Udacity Data Scietist Nanodegree я разработал алгоритм с использованием конволюционных нейронных сетей (CNN) для...
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
0
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы конвертируете в цветовое пространство Lab, разделите 3 канала, контрастно растянете их и расположите рядом по странице с L слева, a в центре и b справа с помощью ImageMagick:

magick image.png -alpha off -colorspace lab -separate -normalize +append lab.png

В центральном канале (a) вы можете видеть, что ваш пластик хорошо отличается от трещины слева на изображении. Это говорит о том, что порог OTSU канала a будет хорошим дискриминантом того, что вы ищете.

С OpenCV это может выглядеть так:

import cv2 as cv

# Load image
im = cv.imread('image.png')

# Convert to Lab colourspace and take "a" channel
Lab = cv.cvtColor(im,cv.COLOR_BGR2LAB)
a = Lab[..., 1]

# discriminate plastics using "a" channel
plastics = cv.threshold(a, 0, 255, cv.THRESH_OTSU+cv.THRESH_BINARY)[1]

Первое изображение

Второе изображение


Порог Оцу не работает так хорошо для вашего третьего изображения, потому что с левой стороны больше «трещин», чем пластика, поэтому в итоге вы получаете две категории — «фон» и «трещины», а не желаемые. «фон» и «пластика». Однако канал a по-прежнему осуществляет дискриминацию, если вы обнаружите порог (не Оцу). Например, продолжая код выше:

norm = cv.normalize(a, None, alpha=0, beta=255, norm_type= cv2.NORM_MINMAX)

Другие вопросы по теме