¿Qué es el modelo RGB y cómo se relaciona con Python?
El modelo RGB es una representación de colores que se basa en la combinación de tres colores: rojo, verde y azul, conocidos por sus siglas en inglés como Red, Green, y Blue. Este sistema es ampliamente utilizado en dispositivos electrónicos para la creación de una amplia gama de colores. En este contexto, vamos a explorar cómo implementar el modelo RGB utilizando Python, un lenguaje de programación versátil que permite representar y manipular datos de manera eficiente.
¿Cómo se define un vector en el modelo RGB?
En el contexto del modelo RGB, un color puede ser representado por un vector de tres componentes que corresponden a las concentraciones de los colores rojo, verde y azul. Cada componente del vector es un número entero positivo, lo que significa que los valores no pueden ser menores que cero. Para ejemplificar:
Un vector ([255, 0, 0]) representa el color rojo.
Un vector ([0, 255, 0]) representa el color verde.
Un vector ([0, 0, 255]) representa el color azul.
Un vector ([0, 0, 0]) representa el color negro o la ausencia de color.
¿Cómo se representa el modelo RGB en Python?
En Python, los colores RGB pueden ser representados mediante listas, que son una de las estructuras más básicas en Python. Las listas son colecciones ordenadas de elementos que pueden ser modificadas.
Cada lista contiene tres elementos que representan la concentración de cada color primario. Esta capacidad de cambiar valores dentro de una lista es lo que le otorga a las listas el atributo de ser "mutables".
¿Qué diferencias hay entre listas y tuplas en Python?
En Python, además de listas, también se pueden usar tuplas para representar los vectores RGB. Sin embargo, a diferencia de las listas, las tuplas son inmutables, lo que significa que sus valores no pueden ser modificados una vez creados.
tupla_ejemplo =(1,2,3)tipo_tupla =type(tupla_ejemplo)# Esto devolverá <class 'tuple'>lista_ejemplo =[1,2,3]tipo_lista =type(lista_ejemplo)# Esto devolverá <class 'list'>
¿Cómo manipular vectores en Python?
Una herramienta útil en Python para trabajar con listas es la función len(), que permite obtener la longitud de una lista, es decir, cuántos elementos contiene.
longitud_rojo =len(rojo)# Esto devolverá 3longitud_verde =len(verde)# Esto devolverá 3
Además, se pueden utilizar operadores para manipular listas. Por ejemplo, el operador + puede concatenar dos listas:
Te animamos a experimentar creando nuevos vectores y manipulándolos como se ha mostrado. Por ejemplo, intenta crear un vector llamado negro_y_azul, y luego extrae de él los subconjuntos correspondientes al negro y al azul.
Continúa profundizando en la intersección entre matemáticas y programación. La habilidad para traducir conceptos matemáticos al código computacional es poderosa y te abre un mundo de posibilidades creativas. ¡Sigue así, estás en el camino correcto!
CUIDADO con el minuto 9:31, ya que, matemáticamente rojo y verde se habían definido como vectores de 3 dimensiones y si los sumamos nos da como resultado otro vector de 3 dimensiones pero python cuando suma listas de largo 3 no nos da como resultado una lista de largo 3 sino que concatena las listas y resulta una lista de largo 6
Gracias por tu aporte, no lo había pensando.
Lo que sucede es que en el ejemplo de los colores (donde muestra la página de combinaciones RGB), suma como tal los vectores, pero en python concatena los vectores, ciertamente puede confundir que a las 2 acciones las describa como una suma, pero una es una suma de vectores y la otra una concatenación.
Ejercicio Negro y Azul 😁
¡Buenísimo Carlos!
Muy bien, buen aporte.
en el minuto 6 aprox, el profe comenta que una tupla es con [ ] y una lista es con ( ) pero es al revés.
ciertooo
Nota:
Va a ser confuso el manejo de los indices, con eso del cambio entre la notación en matemáticas y en programación, tenerlo presente, saludos :)
Es algo a tener mucho en cuenta. :D
Aunque para los que hemos programado más es algo natural recordar que en el código iniciamos siempre en 0, pero qué padre definir desde un inicio este tipo de notación para hacerlo más sencillo.
Por otro lado el lenguaje R (muy usado en data science) no funciona iniciando en 0. Es un lenguaje prácticamente creado para estadística y su índice inicia en 1. 🤓®
¿Pero en dónde escribimos el código (¿en un editor de código?) y ejecutamos nuestro código en Python?
Este curso lo tomo como parte de la ruta de aprendizaje de Data Science en donde aprendimos python antes de ver este curso de Algebra Lineal, entonces, te recomiendo usar el editor Visual Studio Code para trabajar, saludos.
De igual manera Ignacio puedes correr el código en Google Colab, ahí no tienes que instalar nada y se corre directo en tu navegador.
Excelente clase! me gustó como se logró pasar lo de la teoría de los vectores a código con python. Subvectores, stack de vectores, dimensión de vectores.
Los vectores en Python se representan con la estructura de datos lista
tupla = (1,1,1)
Las tuplas son otra estructura de datos pero son imutables
print(type(rojo))
print(type(tupla))
print('El color rojo se representa con el vector ', rojo)
print('El color verde se representa con el vector', verde)
print('El color azul se representa con el vector', azul)
Para conocer la dimensión de un vector, podemos utilizar el método len
print('La dimensión del vector rojo es ', len(rojo))
Se pueden sumar vectores y así mismo crear stacks de vectores
rojo_verde = rojo + verde
print('La suma del vector rojo y verde es ', rojo_verde)
Se puede hacer sub vectores en python indicando del subindice que parte el vector hasta el ultimo subindice
print('Se partira el vector rojo ', rojo[0:2])
`negro_y_azul = negro+azul
print('El subvector del vector negro_y_azul que corresponde al negro es el vector que va del 0:3', negro_y_azul[0:3])
print('El subvector del vector negro_y_azul que corresponde al azul es el vector que va del 3:6', negro_y_azul[3:6])`
La forma de sumar cada elemento de los vectores en Python es haciendo una iteración por cada uno de los elementos de los vectores con un ciclo (en la mayoría de los caso es mucho mas intuitivo usar 'for') y así ir sumado en cada iteración, los valores.
lista1 =[1,2,3,4]lista2 =[5,6,7,8]lista3 =[]for i inrange(len(lista1)): lista3.append(lista1[i]+ lista2[i])print(lista3)```
Gracias, buen aporte
rojo =[255,0,0]verde =[0,255,0]azul =[0,0,255]negro =[0,0,0]Negro_y_Azul= azul + negro
print('El vector resultante de concatenar los vectores negro y azul es',Negro_y_Azul)print('El subvector del vector Negro_y_Azul que corresponde al negro es el vector que va del 0:3 = ',Negro_y_Azul[0:3])print('El subvector del vector Negro_y_Azul que corresponde al azul es el vector que va del 3:6 = ',Negro_y_Azul[3:6])```
stack_negro_azul = negro + azul
print(f'el stack entre los vectores negro y azul: {stack_negro_azul}')#Subvectoresprint(f'subvector negro y azul entre 0:3 {stack_negro_azul[0:3]}')print(f'subvector negro y azul entre 3:6 {stack_negro_azul[3:6]}')
Con el "+" Concateno los dos y depues los separo con los indices 0:3, 3:6
Porque a la hora de imprimir Rojo_y_verde[3:6] imprime
= [0,255,0] por que no existe esa posicion del vector ??
Porque cuando hacemos slicing a una lista de Python, por defecto el intervalo se interpreta como cerrado hacia la izquierda y abierto hacia la derecha, es decir, que para Python el intervalo (3,6) de una lista, corresponde a los elementos que están entre el 3 y el 6 incluyendo el 3, pero SIN incluir el 6, es decir, los elementos 3, 4, 5.
Es por esto que el primer intervalo de 0 a 3 solo nos devuelve hasta el elemento con índice 2 y no hasta el de índice 3.
Corríjanme si me equivoco, pero entonces el modelo aditivo RGB no podría definirse como un 3-vector cuyas entradas son los números naturales? Digo, como para simplificar.
El problema con hacer eso es que no está muy claro si el 0 entra en los naturales.
Si pones x ∈ ℕ₀ y 0 ≤ x ≤ 255, entonces todo claro.
Es importante tener en cuenta que, tal como vimos al principio de la clase, el modelo RGB completo se denota como (ℤ^3 , +). Sin embargo, la operación de la suma para dicho modelo no corresponde ni con la concatenación que se hizo en clase, ni tampoco con la suma tradicional de vectores donde se suman los elementos con el mismo índice.
Hay una pequeña sutileza, ya que, para el modelo RGB, la suma está definida como la suma de los elementos con el mismo índice DIVIDIDOS por el número de vectores/colores que se estén sumando (a manera de un promedio).
Por ende, si queremos sumar el color amarillo con el verde, tendríamos los vectores:
amarillo =[255,255,0]verde =[0,0,255]
Y si, lo que queremos es sumar los colores, tendriamos que hacerlo de esta forma:
# Se crea una lista vacía para guardar la suma de los coloressuma_colores =[]# Se itera sobre los índices de los coloresfor i inrange(3):# Se aplica el promedio valor_indice_i =(amarillo[i]+ verde[i])/2# Se redondea al entero más cercano valor_indice_i =int(round(valor_indice_i,0))# Se agrega el valor a la lista suma_colores.append(valor_indice_i)
Con lo cual, obtendriamos el vector:
[128,128,128]
El cual corresponde al color gris, que difiere de lo que podríamos pensar a simple vista que sería el resultado si fuera una suma de vectores estándar donde el resultado sería el vector [255, 255, 255] lo cual nos devolvería un color blanco.
Este tipo de cosas es importante tenerlas en cuenta, ya que, en muchos casos, en programación tenemos modelos donde las operaciones tradicionales entre nuestros vectores no se pueden aplicar directamente. Tal como fue el caso de este modelo, donde la operación de la suma tuvo que ser definida de esta forma, puesto que, de otra manera, se podrían dar muchos casos donde la suma nos diese elementos con un valor mayor al 255 los cuales no están definidos para el modelo y por ende, un computador no sabría interpretarlos.
Quisiera aclarar sobre algo que puede ser confuso para algunas personas. En las líneas de código 17 y 19 se aplica el concepto de slicing en Python, lo cual consiste en extraer una porción de una secuencia (lista, tupla o string). Aquí lo importante es que cuando se realiza slicing se incluyen elementos desde el índice 0 (o el primer índice que le pasemos) hasta antes del último índice que le pasemos.
La sintáxis básica del slicing es: secuencia(inicio:final:salto).
- secuencia: es la variable Rojo_y_Verde en la cual incluimos nuestras 2 listas rojo y verde.
- inicio: el índice de inicio del slice (incluyente).
- final: el índice final del slice (excluyente).
- salto (opcional): el salto que se da para omitir elementos cada determinada cantidad de elementos.
Se van a imprimir los índices 0, 1 y 2, pero no el 3.
[255, 0, 0]
Reto Cumplido
Operaciones con vectores:
Una vez que tienes tus vectores creados, puedes realizar diversas operaciones matemáticas con ellos. Por ejemplo, para sumar dos vectores, simplemente utilizas el operador de suma +:
v = np.array([1,2,3])v = np.array([[1,2,3]])v1 = np.array([1,2,3])v2 = np.array([4,5,6])suma = v1 + v2
v = np.array([1,2,3])escalar =2multiplicacion = v * escalar