Я хотел бы создать два изображения из исходного изображения RAW, в данном случае Canon CR2. Я отсортировал RAW-преобразование и кое-что обработал. Мои окончательные изображения должны быть в формате PNG с альфа-маской и в формате JPG 95% качества с альфа-областью, заполненной черным цветом. У меня есть тестовое изображение, показывающее, как далеко я продвинулся в обнаружении объекта:
Итак, как вы можете видеть, я хочу изолировать объекты от серого фона. Я также хочу максимально и в идеале полностью замаскировать любые тени на сером фоне. Я использую сценарий Python2, который я написал, и до сих пор в основном scikit-image. При необходимости я бы переключился на другую библиотеку обработки изображений, совместимую с Python. Кроме того, мне нужно сделать все шаги в памяти, чтобы я сохранял только один раз в конце всей обработки изображений с PNG, а затем JPG. Так что нет подпроцесса. Открыть и т. Д.
Из примеров изображений вы увидите, что, по крайней мере, я думаю, что у меня уже есть какой-то способ решения. Я использовал scikit-image и его алгоритм Canny edge для изображений, которые вы видите в моих примерах.
Что мне теперь нужно сделать, так это выяснить, как заполнить объект на изображениях Canny белым цветом, чтобы я мог получить правильную сплошную белую маску. В большинстве моих примеров изображений с примененным фильтром Кэнни кажется, что есть хорошее обнаружение краев для самих предметов, обычно с большой непрерывной границей. Но я предполагаю, что в будущем я могу получить некоторые изображения, где этого не происходит, и могут быть небольшие разрывы в основной границе. Мне нужно обработать это происшествие, если похоже, что это будет проблемой для последующих этапов обработки.
Кроме того, мне интересно, нужно ли мне увеличить общую границу на один пиксель и установить для нее тот же цвет, что и мой 0,0-пиксель (т.е. первый пиксель вверху / слева в фоновом режиме), а затем запустить мой фильтр Canny и затем сжать мой граница снова на 1px? Это должно позволить обнаруживать нижний край и когда объекты ломают верхнюю или боковые стороны кадра?
Так что на самом деле я просто ищу совета и задаюсь вопросом, куда пойти дальше, чтобы получить красивую сплошную маску. Он должен оставаться двоичным как двоичная маска (т.е. все, что находится за пределами основного объекта, должно быть полностью замаскировано до 0). Это означает, что мне нужно будет запустить что-то, что в какой-то момент будет искать изолированные островки пикселей ниже определенного объема пикселей - возможно, последний шаг и добавить их в маску (например, 50 пикселей или около того).
Кроме того, в целом, практическое правило будет заключаться в том, что лучше, если будет замаскирована небольшая часть объекта, чем маскируется меньшая часть фона (т.е. я хочу, чтобы все или как можно больше областей фона / тени были замаскированы. )
Я пробовал несколько вещей, но не совсем понял. Я думаю, что что-то вроде find_contours в sci_kit может помочь. Но я не совсем понимаю из примеров scikit-image, как я бы выбрал, а затем превратил обнаруженный контур в маску. Я убил довольно много времени, экспериментируя сегодня безуспешно, и поэтому я подумал, что спрошу здесь и посмотрю, есть ли у кого-нибудь лучшие идеи.
Это многообещающий метод на основе OpenCV:
Я хотел бы придерживаться scikit-image или какой-либо другой сменной библиотеки изображений numpty для python, если это возможно. Однако, если это проще и быстрее с OpenCV или другой библиотекой, тогда я открыт для идей, пока я могу придерживаться Python.
Также стоит иметь в виду, что для моего приложения у меня всегда будет изображение фона без объекта. Так что, может быть, мне стоит пойти по этому пути. Проблема в том, что я не думаю, что простой разностный подход хорошо работает с тенями. Мне кажется, что в какой-то момент требуется какое-то обнаружение краев для более качественного подхода к маскировке.
"Источник 1"
"Источник 2"
"Источник 3"
"Результат 1"
"Результат 2"
"Результат 3"