2012-01-30 18 views
8

Estoy desarrollando una aplicación iOS en la que el usuario puede cambiar una parte del color de una imagen, digamos una Taza de té, al tocarla. Estoy usando el algoritmo Floodfill para rellenar los colores para que el usuario tenga que tocar la taza de té para cambiar su color. Eso está funcionando bien. Pero, el color final se ve un poco diferente que el color de reemplazo. Tengo algún problema para encontrar una mejor lógica para convertir el color del objeto (taza de té) al color seleccionado teniendo en cuenta su saturación & ligereza.Mejor lógica/algoritmo para colorear imágenes

Estoy usando la siguiente lógica para obtener el color del resultado. Estoy representando el color como (tono, saturación, valor).

touchedColor = (tchd_h, tchd_s, tchd_v); // I am not using this now 

pixelColor = (old_h, old_s, old_v); 
replacementColor = (new_h, new_s, new_v); 
resultColor = (new_h, new_s, old_v); 
pixelColor = resultColor; 

La copa antes de la pintura (en el círculo con el rojo).

enter image description here

El replacementColor seleccionado.

enter image description here

Copa después de pintar el replacementColor (en el círculo de color rojo).

enter image description here

Ver la imagen final anterior. Como estoy simplemente cambiando sólo la saturación tonalidad &, y no el valor del pixelColor, el color aplicado no se ve similar a la seleccionada replacementColor. La luminosidad de la imagen permanece inalterada.

Si cambio el valor junto con tonalidad & saturación como este,

resultColor = (new_h, new_s, new_v); 
pixelColor = resultColor; 

A continuación, la copa se vuelve plano de color, faltan las luces & tonos como este,

enter image description here

Quiero alguna idea para ajustar la lógica anterior para cambiar el color del píxel en un color de reemplazo coincidente. Puede ser una fórmula para derivar saturación & valor.

+0

¿Quizás nos muestre un ejemplo de lo que piensa que está mal? No puedo ver un problema con la premisa básica. –

+0

@Mark Ransom, Sí, he actualizado mi pregunta con las imágenes. – EmptyStack

Respuesta

3

En su ejemplo, llamemos al color rosa el "Color To Replace" y califiquemos el color marrón como "Replacement Color". Para cada píxel en el destino, encuentre el píxel correspondiente en la fuente. Vea cómo varía desde el "Color para reemplazar". Ahora haga ajustes similares al "Color de reemplazo" y utilícelo como el color en el píxel de salida actual.

Como ejemplo, si el píxel fuente actual es más oscuro que el color para reemplazar por 5 unidades "v", configure el píxel de salida como el color de reemplazo oscurecido por 5 unidades "v". (Y también desearía hacer los mismos ajustes de matiz y saturación).

Probablemente necesite limitar el rango de colores que ajusta para no cambiar otros objetos de un color diferente.

+0

Gracias por la respuesta. Puedo entender lo que estás diciendo. No sé cómo implementarlo en tiempo real. ¿Puedes mostrarme algún pseudo código o algo así? Estoy luchando por implementar esto por más de un mes. – EmptyStack

+0

Para hacerlo en tiempo real, puede intentar escribir un sombreador OpenGL en glsl. Un algoritmo básico de pseudocódigo sería algo como esto: 'pixelColor = (old_h, old_s, old_v); pixelDiff = (tocado_h - old_h, tocado_s - old_s, tocado_v - old_v); resultColor = (new_h - pixelDiff.h, new_s - pixelDiff.s, new_v - pixelDiff.v); ' – user1118321

+0

Calcular el resultColor basado en el color tocado no da una salida uniforme ya que el color del coche no es un color sólido. Por ejemplo, si toco un color oscuro en el automóvil, entonces da la salida en una variante, y si selecciono un color claro en el automóvil, entonces la salida está en una variante diferente. – EmptyStack

Cuestiones relacionadas