Нет, ваш алгоритм неисправен . Вот небольшой фрагмент вашего второго примера:

Вы неправильно обрабатываете, когда объект переднего плана частично смешан с зеленым фоном. В идеале исходное изображение с точечной выборкой. Каждый пиксель будет представлять либо только зеленый фон, либо только передний план. Ваши входные изображения не такие, а ваш алгоритм плохо с этим справляется.
Лучший способ справиться с этим - начать с изображений с гораздо более высоким разрешением, чем вы в конечном итоге хотите. Это больше соответствует случаю точечной выборки, и любая смешанная переходная область будет составлять меньшую долю от общего размера изображения.
Правильные алгоритмы синего или зеленого экрана пытаются справиться с этим делом, хотя оно становится сложным, и вы всегда можете придумать случаи, которые могут его обмануть. Иными словами, алгоритм должен по существу угадывать информацию, которой там нет.
Одним из способов является специальная обработка кромок. В области перехода между сплошным передним планом и сплошным фоном необходимо включить дополнительную логику. В этой области перехода вы предполагаете, что любое изменение оттенка от переднего плана в направлении оттенка фона частично смешивается с фоном, а затем удаляете его. Опять же, это может быть сложно, и это можно обмануть, но в большинстве случаев это принесет больше того, что вы думаете, что должно. Даже относительно простая логика исправит случай, который я показываю выше. Другие случаи, возможно, никогда не будут установлены к Вашему удовлетворению.
Опять же, лучший ответ - начать с оригинала в высоком разрешении.