Может быть связано с сглаживанием. Суть сглаживания состоит в том, что чем больше пиксель находится ближе к краю (границе чего-либо), тем больше цвета пикселя смешивается с цветом фона (или мы можем сказать, что он более «прозрачный»).
Таким образом, проблема может заключаться в том, что вам нужно не только заменить исходный цвет на целевой цвет, но также и пиксели, которые были смешаны из исходного цвета в цвет фона.
Для этого вам необходимо:
1) Выполните какой-нибудь алгоритм обнаружения фронта - он может быть простым или расширенным, как вы хотите.
2) Если пиксель близок к краю, а пиксель находится рядом с другим пикселем исходного цвета, рассчитайте коэффициент непрозрачности (1-прозрачность), который будет равен
opacity = (pixel_color-background_color)/(source_color-background_color)
3) Теперь вычислите ваш цвет, которому вы должны заменить текущий сглаженный пиксель:
new_color = background_color * (1-opacity) + opacity * target_color
И поместите этот новый цвет вместо сглаженного пикселя.
В итоге:
Вам необходимо обнаружить сглаженные пиксели и заменить их версией сглаженных пикселей.
Самая сложная часть алгоритма - обнаружение сглаженных пикселей - потому что вы не можете быть уверены, что нашли все краевые пиксели с вероятностью 100%. Кроме того, вы не можете быть уверены, что сглаживает пиксель или изначально был сделан из такого цвета). Из-за этого вы можете получить некоторый цветовой шум в конечном продукте. Но в любом случае это должно быть лучше, чем просто сидеть и ждать :)
удачи