2012-07-11 11 views
8

Estoy utilizando OpenCV con Python. Tengo una imagen, y lo que quiero hacer es configurar todos los píxeles del valor de BGR [0, 0, 255] a [0, 255, 255].OpenCV: configuración de todos los píxeles del valor de BGR específico en otro valor de BGR

me hizo una previous question sobre cómo posterizar una imagen, y de la respuesta que se enteraron de la indexación con una serie de índices, por ejemplo: la imagen [imagen> 128] = 255

que entienden cómo funciona este , ya que image> 128 devolverá una matriz de matriz multidimensional de índices que satisfacen la condición, y luego aplico esta matriz a la imagen y los establezco en 255. Sin embargo, estoy confundido con cómo extender esto para hacer un valor para una matriz.

He intentado hacer lo siguiente:

 red = np.array([0, 0, 255]) 
     redIndex = np.where(np.equal(image, red)) 
     image[redIndex] = np.array([0, 255, 255]) 

pero no funciona, con el error:

ValueError: array is not broadcastable to correct shape 

¿Hay una manera eficiente de manejar esto?

+2

Necesito una respuesta en Python con suerte utilizando algo disponible con NumPy, no C++, por lo que no es un duplicado. – steve8918

+0

Hola, ¿quieres crear una imagen con todos los elementos [0,255,255] o simplemente cambiar todos los elementos en una imagen con valor [0,0,255] a [0,255,255]? –

+0

Hola, me gustaría cambiar todos los elementos en una imagen con valor [0,0,255] a [0,255,255], gracias – steve8918

Respuesta

14

considerar una imagen como matriz como a continuación:

>>> red 
array([[[ 0, 0, 255], 
     [ 0, 0, 255], 
     [ 0, 0, 255], 
     [ 0, 0, 255], 
     [ 0, 0, 255]], 

     [[ 0, 0, 255], 
     [ 0, 0, 255], 
     [ 0, 0, 255], 
     [ 0, 0, 255], 
     [ 0, 0, 255]]]) 

Sus todos los elementos son [0,0,255]. Su forma es de 2x5x3. Solo piensa que hay otros valores también en él. (No puedo crear todo eso).

Ahora encuentra dónde [0,0,255] están presentes y cámbielos a [0,255,255]. Puede hacerlo de la siguiente manera:

>>> red[np.where((red == [0,0,255]).all(axis = 2))] = [0,255,255] 

Ahora revise el rojo.

>>> red 
array([[[ 0, 255, 255], 
     [ 0, 255, 255], 
     [ 0, 255, 255], 
     [ 0, 255, 255], 
     [ 0, 255, 255]], 

     [[ 0, 255, 255], 
     [ 0, 255, 255], 
     [ 0, 255, 255], 
     [ 0, 255, 255], 
     [ 0, 255, 255]]]) 

Espero que esto es lo que quieres.

Resultados de la prueba:

Verificar el código de este enlace: https://stackoverflow.com/a/11072667/1134940

que quieren cambiar todos los píxeles de color rojo a amarillo, tal como solicitó en cuestión.

por lo que añade esta pieza por debajo del código al final:

im2[np.where((im2 == [0,0,255]).all(axis = 2))] = [0,255,255] 

A continuación se muestra el resultado que obtuve:

enter image description here

¿Qué pasa si quiero cambiar a tierra verde a tierra amarilla :

im2[np.where((im2 == [0,255,0]).all(axis = 2))] = [0,255,255] 

Resultado:

enter image description here

+0

Sí, gracias, ¡esto es perfecto! Una pregunta de seguimiento: ¿por qué es válido el término "rojo == [0, 0, 255]"? ¿Es == válido para nuamy array compares? Pensé que tenía que usar "igual" – steve8918

+0

Lo siento, no recibí la pregunta. –

+0

Vaya, ignore la pregunta, creo que me he mezclado. ¡Gracias de nuevo! – steve8918

Cuestiones relacionadas