Dada una imagen, ya sea como entrada (posiblemente en tripletes RGB) o con el nombre de archivo como entrada (puede suponer que la imagen tiene un nombre de archivo específico, posiblemente sin extensión), genera una imagen que representa un solo canal de color de la imagen.
También tomará otra entrada, que representa qué canal emitir. La entrada puede ser uno de los 3 símbolos distintos. Sin embargo, los símbolos deben ser una cadena o un número. Sin embargo, no puede tomar una matriz para aplicarla a la matriz como entrada. (como {1, 0, 0}
, o {0, 1, 0}
).
Sacará el <input>
canal de la imagen de entrada. Puede guardarlo en un archivo o generar un conjunto de pares RGB.
Su programa no debe tener límites en el tamaño de la imagen (en px) y debe admitir tripletas RGB .png
, .jpg
/ .jpeg
/ .JPG
o como formatos de imagen. (Sin embargo, puede admitir tantos como desee)
Caso de prueba:
Canal rojo:
Canal verde:
Canal azul:
Y otro caso de prueba, completamente de rojo. Foto original , rojo , verde y azul . (advertencia: el canal liso y rojo duele mirar demasiado tiempo)
2 casos de prueba más:
Original , rojo , verde , azul .
Original , rojo , verde , azul .
Los últimos dos casos de prueba son de Imágenes con todos los colores .
Respuestas:
APL (Dyalog) , 7 bytes
I / O: conjunto de tripletes RGB
Pruébalo en línea!
⍳3
primeros tres enteros⎕=
comparar la entrada numérica (el canal elegido) con ese⊂
adjuntar (para que cada triplete de imagen empareje este triplete completo)⎕×
multiplicar la entrada numérica (la matriz de tripletes) con esofuente
JavaScript (ES6), 29 bytes
La entrada es una matriz 2D de enteros de 24 bits (p
[[0x0000ff,0x00ff00],[0xff0000,0xffffff]]
. Ej. ) Y16711680
para rojo,65280
para verde y255
para azul. Si esto no es válido, intente esto en su lugar:JavaScript (ES6), 48 bytes
La entrada es una matriz 3D de valores de color y
0
para rojo,1
para verde y2
para azul.fuente
Mathematica, 13 bytes
Esta debería ser la versión legítima de la respuesta de JungHwan Min. Esta función toma la imagen y uno de
Red
,Green
,Blue
como entrada. Por ejemplo:Como dato curioso, también existe el
ColorSeparate
que le brinda canales individuales, pero los devuelve como imágenes de un solo canal / escala de grises, por lo que deberá multiplicarlos por el color de todos modos.fuente
Bash + ImageMagick,
353227 bytesAsume la imagen está en el archivo
i
, y el guión toma uno deRG
,BG
,BR
para el azul, rojo y verde, respectivamente; salidas al archivoi
.fuente
Espectro , no competitivo, 1 byte
(No compite porque este desafío inspiró este lenguaje). En realidad, Spectrum es una biblioteca npm con una interfaz de idioma para los comandos.
Toma entrada como:
Llame al programa como:
Alternativamente, puede proporcionar información a las indicaciones:
Esto deja la imagen en la pila. Para verlo, agregue
O
al final, así:Para un poco de diversión extra, inténtalo
echo filename | node spectrum.js "wO"
. Realiza los tres aislamientos de canal a la vez:fuente
n[d1=`[d1-P*][],.g!]#Pdd1-P~%-1=p
JavaScript (ES6), 29 bytes
Muy parecido a la respuesta de ETHproductions pero con una entrada más flexible que el primer método y más pequeña que el segundo.
Esto define una función que acepta la imagen como una matriz unidimensional de intensidades numéricas de color. Esta función luego devuelve otra función que acepta un valor entero que representa el canal de color deseado.
Los colores se pueden representar mediante cualquier rango numérico siempre que 0 indique una ausencia completa de color. Por ejemplo
0.0 - 1.0
o0 - 255
Ejemplos:
Si los datos de la imagen tienen el formato RGB, al llamar a la función con argumentos
(imageData)(0)
, la imagen se devolverá solo con el canal rojo.Si los datos de la imagen están en el formato BGR, la llamada a la función con argumentos
(imageData)(2)
también devolverá la imagen solo con el canal rojo.fuente
i%3==b&&v
también funciona.Python 2, 69 bytes
Todavía jugando al golf.
Toma la entrada como
filename, n
(donden
es 0, 1 o 2). Guarda la nueva imagen sobre la anterior.0
es verde,1
es rojo y2
es azul. Gracias a @ovs, @Mikhail y @Rod por los bytes desactivados.fuente
k[:,:,x[i][0]]=k[:,:,x[i][1]]=0
conk[:,:,[1,2,0][i]]=k[:,:,i]=0
from cv2 import*
para guardar algunos bytesk[:,:,i-1]=k[:,:,i]=0
conk[:,:,[i,i-1]]=0
CJam , 12 bytes
Un bloque anónimo que espera una matriz 3D de tripletes RGB y un número entre 0 y 2 inclusive en la pila. Deja la matriz extraída en la pila después.
Posiblemente podría jugar golf usando un formato de entrada extraño, pero siento que eso es un poco trampa.
Pruébalo en línea!
El caso de prueba está hecho solo para demostrarlo, usar los trillizos de una imagen real sería demasiado grande.
Explicación
fuente
PowerShell , 282 bytes
Nada de esto es lujoso "jugar al golf" o "usar incorporados". Phooey en eso. ;-)
Esto aquí toma la ruta completa de un PNG de entrada (aunque, estrictamente hablando, no necesita ser un PNG, ya que JPG, BMP, etc. son compatibles con .NET, pero solo lo he probado en PNG), y uno
(R, G, B)
para el canal de color, luego los almacena en$x
y$y
. Luego creamos unNew-Object
tipoSystem.Drawing.Bitmap
de$x
y lo almacenamos$a
.Luego hacemos un doble bucle sobre todos los píxeles. Primero desde
1
hasta$a
's.Height
, el establecimiento de$h
cada iteración (que es un índice de cero, por lo que es por eso que--$_
, lo que ahorra más de bytes( .height-1)
. En el interior, nos bucle desde1
hasta$a
' s.Width
.Cada iteración, estamos realizando un
.GetPixel
en lasw,h
coordenadas particulares , que devuelve unSystem.Drawing.Color
objeto. Sacamosselect
losR G B
valores de los mismos. Eliex
aquí es un buen truco que convierte esto en una tabla hash (por ejemplo, algo así@{R=34; G=177; B=76}
) para que podamos índice en que directamente con el canal de color deseada[$y]
. Ese valor se almacena en$i
.A continuación, establecemos tres valores
$r, $g, $b
para que sean el resultado de algunos operadores pseudoternarios basados en el valor de la letra de$y
. Entonces, por ejemplo, si$y
esR
, entonces el resultado aquí es$r=$i, $g=0, $b=0
.Luego, hacemos una
.SetPixel
copia de seguridad de esaw,h
coordenada en particular , construyendo una nuevaSystem.Drawing.Color
utilizando la estáticaFromARGB
(que supone que el alfa es completamente opaco). Una vez que hayamos terminado el bucle, simplemente pasaremos.Save
el PNG a un nuevo archivo.Nota: Esto lleva mucho tiempo, ya que recorre cada píxel de forma completamente independiente y realiza varios cálculos y llama a cada iteración.
Pruebas:
fuente
Bash + ImageMagick, 41 bytes
La entrada es un archivo llamado
x
, línea de comando parámetro uno deR
oG
oB
La salida sobrescribe el archivo de entrada
Se diferencia de la respuesta de betseg al tomar un parámetro de canal de una sola letra más natural. También sobrescribe en lugar de generar un nuevo archivo que betseg es libre de robar :)
fuente
$1
comillas necesitan, los nombres de archivo pueden tener espaciosx
durante 1 byte.Chip , 78 bytes
Pruébalo en línea!
Chip es un lenguaje 2D que opera en los bits componentes de cada byte en una secuencia de bytes.
Visión general
Esta solución particular espera que el primer byte de entrada sea el carácter de control, para definir qué canal (es) mantener, y los siguientes son los bytes de datos de imagen. Los datos de la imagen deben ser tripletes RGB, un byte por canal, 24 bits por píxel:
El carácter de control se interpreta como un campo de bits, aunque solo los tres bits más bajos tienen significado:
Esto significa que podemos usar caracteres ASCII para seleccionar qué canal queremos:
1
significa rojo2
significa azul4
significa verdeO haz algo más elegante:
5
mantener rojo y azul, pero no verde7
mantener todos los canales (la imagen no cambia)0
soltar todos los canales (la imagen es negra)Cómo funciona
Esta solución es bastante complicada debido al golf, pero aquí va:
C
,B
yA
, y almacenar los bits en sus correspondientesM
células de Emory. Además,S
presione hacia arriba la salida para el primer ciclo./
está activado interruptores para generar el byte de entrada actual; si está apagado, abra los interruptores para que generemos un byte cero.Ver los resultados
Claro, podría usar hexdump o algo aburrido, pero resulta que este es (casi) un formato de imagen válido real: PixMap portátil binario .
Simplemente coloque los datos de la imagen desde arriba (menos el byte de control, por supuesto) en el archivo a continuación, ajuste el ancho / alto para que sea válido, y puede ver la imagen en un visor adecuado como IrfanView, aunque más simples (como la mayoría del navegador incorporado) no puede manejarlo.
Por ejemplo (usando escapes para los datos sin procesar):
fuente
MATL,
2113 bytesEl canal de color debe ser especificado utilizando el siguiente mapeo:
1:red
,2:green
,3:blue
Los intérpretes en línea no pueden usar
imread
para leer imágenes, así que aquí hay una versión ligeramente modificada donde he codificado una imagen aleatoria en la fuente .Explicación
fuente
05AB1E , 16 bytes
Pruébalo en línea!
Utiliza colores hexadecimales en un formato de matriz 2D y [0,1,2] para cada canal.
fuente
Clojure,
421332 bytes-89 bytes al incluir todo agresivamente, cambiar mi viejo método ridículo de quitar los canales y deshacerse de una importación accidental innecesaria.
Golpeé esto media hora antes de que mi turno comenzara sin tener idea de lo que estaba haciendo. Tengo poca experiencia
BufferedImage
, por lo que puede haber una mejor manera de hacerlo. También estoy abusandoColor
de convertir de ida y vuelta entre enteros y representaciones de colores de canales individuales.Esto es cómicamente enorme en comparación con las otras respuestas por un par de razones (además de lo obvio que Clojure no es un lenguaje de golf):
En lugar de simplemente manipular una matriz de bytes, esto realmente toma como entrada una imagen, la altera y la emite.
Estoy usando Java-interop, que si bien es útil, a veces puede ser bastante detallado. Las importaciones solas son mayores que muchas respuestas.
Vea el código a continuación para un desglose.
fuente
Lua (marco love2d), 498 bytes
Hice esto más como un ejercicio para mí, así que no es tan corto como podría ser (aunque intenté jugar al golf), pero quería agregarlo aquí porque creo que lo hice bien. Incluso si llego demasiado tarde.
Aquí el código de golf, debajo está la versión explicada y desenredada.
Aquí está el código que debe incluir un archivo * .jpg. Después de insertar la imagen, puede presionar los botones numéricos para los canales rojo (1) verde (2) o azul (3). También para ver la imagen predeterminada nuevamente, presione 0. En realidad, solo muestra la imagen en la ventana.
La parte importante que hace todo el trabajo es el sombreador, que es la declaración de cadena pequeña al principio o desenredada:
que obtiene el píxel real de la imagen y solo muestra los canales según sea necesario.
Mi imagen de prueba y las diferentes salidas para los canales (también seguro que los otros)
fuente
C,
6058 bytesLa entrada de imagen es una lista de números (en decimal) entre 0 y 255
stdin
, p. Ej.El canal se especifica como el primer argumento para el programa y es uno de
Ejemplo:
fuente