Dada uma imagem, como entrada (possivelmente em trigêmeos RGB) ou com o nome do arquivo como entrada (você pode assumir que a imagem tem um nome de arquivo específico, possivelmente sem extensão), produza uma imagem representando um único canal de cor da imagem.
Você também fará outra entrada, representando qual canal sair. A entrada pode ser um dos três símbolos distintos. No entanto, os símbolos devem ser uma sequência ou um número. Você não pode utilizar uma matriz para aplicar à matriz como entrada. (tal como{1, 0, 0}
, ou {0, 1, 0}
).
Você emitirá o <input>
canal da imagem de entrada. Você pode salvá-lo em um arquivo ou gerar um conjunto de pares RGB.
Seu programa não deve ter limites no tamanho da imagem (em px) e deve suportar .png
, .jpg
/ .jpeg
/.JPG
, ou RGB trigêmeos como formatos de imagem. (ele pode suportar quantos você quiser)
Caso de teste:
Canal vermelho:
Canal verde:
Canal azul:
E outro caso de teste, totalmente em vermelho. Foto original , vermelha , verde e azul . (aviso: o canal liso e vermelho doem ao olhar por muito tempo)
Mais 2 casos de teste:
Original , vermelho , verde , azul .
Original , vermelho , verde , azul .
Os dois últimos casos de teste são de Imagens com todas as cores .
Respostas:
APL (Dyalog) , 7 bytes
E / S: matriz de trigêmeos RGB
Experimente online!
⍳3
primeiros três inteiros⎕=
comparar a entrada numérica (o canal escolhido) com a⊂
delimite (para que cada trigêmeo de imagem emparelhe esse trigêmeo inteiro)⎕×
multiplicar a entrada numérica (a matriz de trigêmeos) com essafonte
JavaScript (ES6), 29 bytes
A entrada é uma matriz 2D de números inteiros de 24 bits (por exemplo
[[0x0000ff,0x00ff00],[0xff0000,0xffffff]]
) e16711680
para vermelho,65280
para verde,255
para azul. Se isso não for válido, tente o seguinte:JavaScript (ES6), 48 bytes
A entrada é uma matriz 3D de valores de cores e
0
para vermelho,1
verde e2
azul.fonte
Mathematica, 13 bytes
Essa deve ser a versão legítima da resposta de JungHwan Min. Esta função recebe a imagem e um dos
Red
,Green
,Blue
como entrada. Por exemplo:Como um fato divertido, também há
ColorSeparate
canais que oferecem canais individuais, mas os retornam como imagens de canal único / escala de cinza, para que você precise multiplicá-los pela cor posteriormente de qualquer maneira.fonte
Bash + ImageMagick,
353227 bytesAssume a imagem está no arquivo
i
eo script leva um dosRG
,BG
,BR
para o azul, vermelho e verde, respectivamente; saídas para o arquivoi
.fonte
Espectro , não competidor, 1 byte
(Não competindo porque esse desafio inspirou esse idioma.) Na realidade, o Spectrum é uma biblioteca npm com uma interface de idioma para os comandos.
Toma entrada como:
Chame o programa como:
Como alternativa, você pode fornecer informações para os prompts:
Isso deixa a imagem na pilha. Para visualizá-lo, adicione
O
no final, da seguinte forma:Para um pouco de diversão extra, tente
echo filename | node spectrum.js "wO"
. Ele executa todos os três isolamentos de canal de uma vez:fonte
n[d1=`[d1-P*][],.g!]#Pdd1-P~%-1=p
JavaScript (ES6), 29 bytes
Muito parecido com a resposta da ETHproductions, mas com uma entrada mais flexível que o primeiro método e menor que o segundo.
Isso define uma função que aceita a imagem como uma matriz unidimensional de intensidades numéricas de cores. Essa função retorna outra função que aceita um valor inteiro representando o canal de cores desejado.
As cores podem ser representadas por qualquer intervalo numérico, desde que 0 indique uma completa ausência de cor. Por exemplo,
0.0 - 1.0
ou0 - 255
Exemplos:
Se os dados da imagem estiverem no formato RGB, chame a função com argumentos
(imageData)(0)
retornará a imagem apenas com o canal vermelho.Se os dados da imagem estiverem no formato BGR, a chamada da função com argumentos
(imageData)(2)
também retornará a imagem apenas com o canal vermelho.fonte
i%3==b&&v
também funciona.Python 2, 69 bytes
Ainda jogando golfe.
Recebe a entrada como
filename, n
(onden
é 0, 1 ou 2). Salva a nova imagem sobre a antiga.0
é verde,1
é vermelho e2
é azul. Obrigado a @ovs, @Mikhail e @Rod pelos bytes desativados.fonte
k[:,:,x[i][0]]=k[:,:,x[i][1]]=0
pork[:,:,[1,2,0][i]]=k[:,:,i]=0
from cv2 import*
para salvar alguns bytesk[:,:,i-1]=k[:,:,i]=0
pork[:,:,[i,i-1]]=0
CJam , 12 bytes
Um bloco anônimo que espera uma matriz 3D de trigêmeos RGB e um número entre 0 e 2, inclusive na pilha. Deixa a matriz extraída na pilha posteriormente.
Pode ser possível jogar golfe usando um formato de entrada bizarro, mas eu sinto que isso é trapaça.
Experimente online!
O caso de teste é composto apenas para demonstrar, o uso dos trigêmeos de uma imagem real seria muito grande.
Explicação
fonte
PowerShell , 282 bytes
Nada disso gosta de "jogar a entrada" ou "usar built-ins". Phooey nisso. ;-)
Isso aqui segue o caminho completo de um PNG de entrada (embora, estritamente falando, ele não precise ser um PNG, pois JPG, BMP etc. são suportados pelo .NET, mas eu só tentei em PNGs), e um
(R, G, B)
para o canal de cores, depois os armazena em$x
e$y
. Em seguida, criamos umNew-Object
tipoSystem.Drawing.Bitmap
de$x
e armazenamos isso em$a
.Em seguida, fazemos um loop duplo sobre todos os pixels. Primeiro de
1
até$a
's.Height
, definindo$h
cada iteração (é zero indexados, então é por isso que nós--$_
, o que economiza bytes mais( .height-1)
. No interior, circuito de1
até$a
' s.Width
.Cada iteração, estamos realizando um
.GetPixel
nasw,h
coordenadas específicas , que retornam umSystem.Drawing.Color
objeto. Nósselect
expomos osR G B
valores dos mesmos. Aiex
aqui é um truque que transforma isso em uma tabela hash (por exemplo, algo como@{R=34; G=177; B=76}
) para que possamos índice em que diretamente com o canal de cor desejada[$y]
. Esse valor é armazenado em$i
.Em seguida, definimos três valores
$r, $g, $b
para serem o resultado de alguns operadores pseudo-ternários com base no valor da letra de$y
. Então, por exemplo, se$y
forR
, então o resultado aqui é$r=$i, $g=0, $b=0
.Em seguida,
.SetPixel
retornamos a essaw,h
coordenada específica , construindo um novoSystem.Drawing.Color
usando a estáticaFromARGB
(que assume que o alfa é totalmente opaco). Depois de terminar o loop, simplesmente.Save
o PNG para um novo arquivo.Nota: Isso leva um longo tempo, já que percorre todos os pixels de forma independente e executa vários cálculos e chama cada iteração.
Testes:
fonte
Bash + ImageMagick, 41 bytes
Entrada é um arquivo chamado
x
, parâmetro de linha de comando um deR
ouG
ouB
Saída substitui o arquivo de entrada
Difere da resposta da betseg ao aceitar parâmetros de canal de letra única mais naturais. Também sobrescreve em vez de emitir um novo arquivo que o betseg é livre para roubar :)
fonte
$1
precisa de aspas, os nomes de arquivo pode ter espaçosx
com 1 byte de desconto.Chip , 78 bytes
Experimente online!
Chip é uma linguagem 2D que opera nos bits componentes de cada byte em um fluxo de bytes.
visão global
Essa solução específica espera que o primeiro byte de entrada seja o caractere de controle - para definir quais canais manter - e a seguir estão os bytes dos dados da imagem. Os dados da imagem devem ser trigêmeos RGB, um byte por canal, 24 bits por pixel:
O caractere de controle é interpretado como um campo de bit, embora apenas os três bits mais baixos tenham significado:
Isso significa que podemos usar caracteres ASCII para selecionar qual canal queremos:
1
significa vermelho2
significa azul4
significa verdeOu faça algo mais sofisticado:
5
mantenha vermelho e azul, mas não verde7
mantenha todos os canais (a imagem permanece inalterada)0
solte todos os canais (a imagem é preta)Como funciona
Esta solução é bastante confusa devido ao golfe, mas aqui vai:
C
,B
eA
, e armazenar os bits na sua correspondenteM
células Emory. Além disso,S
pressione a saída para o primeiro ciclo./
comutadores para gerar o byte de entrada atual; se estiver desativado, abra os comutadores para gerar um byte zero.Visualizando os resultados
Claro, você pode usar hexdump ou algo chato, mas acontece que este é (quase) um formato de imagem válido real: binário PixMap portátil .
Basta colocar os dados da imagem de cima (menos o byte de controle, é claro) no arquivo abaixo, ajustar a largura / altura para que sejam válidos e você pode ver a imagem em um visualizador adequado como o IrfanView, embora os mais simples (como a maioria dos navegadores) embutidos) não pode lidar com isso.
Por exemplo (usando escapes para os dados brutos):
fonte
MATL,
2113 bytesO canal de cor deve ser especificada utilizando o seguinte mapeamento:
1:red
,2:green
,3:blue
Os intérpretes on-line não podem usar
imread
para ler imagens, então aqui está uma versão ligeiramente modificada na qual codifiquei uma imagem aleatória na fonte .Explicação
fonte
05AB1E , 16 bytes
Experimente online!
Usa cores hexadecimais em um formato de matriz 2D e [0,1,2] para cada canal.
fonte
Clojure,
421332 bytes-89 bytes , incorporando tudo agressivamente, mudando do meu velho e ridículo método de descascar os canais e eliminando uma importação acidental desnecessária.
Chequei isso meia hora antes do meu turno começar, sem ideia do que eu estava fazendo. Eu tenho pouca experiência com
BufferedImage
, então pode haver uma maneira melhor de fazer isso. Também estou abusandoColor
da conversão entre representações de cores de canais inteiros e individuais.Isso é cômico em comparação com as outras respostas por algumas razões (além do óbvio que Clojure não é uma linguagem de golfe):
Em vez de apenas manipular uma matriz de bytes, isso realmente leva como entrada uma imagem, altera-a e gera-a.
Estou usando a interoperabilidade Java, que, embora útil, pode ser bem detalhada às vezes. Somente as importações são maiores que muitas respostas.
Veja o código abaixo para uma análise detalhada.
fonte
Lua (estrutura do love2d), 498 bytes
Fiz isso mais como um exercício para mim, por isso não é tão curto quanto poderia ser (embora eu tenha tentado jogar golfe), mas eu queria adicioná-lo aqui porque acho que fiz o bem. Mesmo que seja tarde demais.
Aqui o código do golfe, abaixo dele, é a versão explicada e desembaraçada.
Aqui está o código que deve obter um arquivo * .jpg nele. Após a inserção da imagem, você pode pressionar as teclas numéricas dos canais vermelho (1) verde (2) ou azul (3). Também para ver a imagem padrão novamente, pressione 0. Na verdade, apenas mostra a imagem na janela.
A parte importante que faz todo o trabalho é o shader, que é a pequena declaração de string no início ou desembaraçada:
que obtém o pixel real da imagem e mostra apenas os canais conforme necessário.
Minha imagem de teste e as diferentes saídas para os canais (também com certeza os outros)
fonte
C,
6058 bytesA entrada de imagem é uma lista de números (em decimal) entre 0 e 255
stdin
, por exemplo,O canal é especificado como o primeiro argumento para o programa e é um dos
Exemplo:
fonte