Quase todos os sensores de câmera digital estão organizados em uma grade de fotosensores. Cada sensor fotográfico é sensível a uma das cores principais : vermelho, verde e azul. A maneira como esses sensores fotográficos são organizados é chamada de filtro Bayer , em homenagem a seu inventor, Bryce Bayer, da Eastman Kodak. Depois que uma imagem é tirada, quatro sensores fotográficos compõem o valor RGB de um pixel na imagem resultante. Sua tarefa é reverter esse processo e colorir os pixels resultantes de acordo com a cor do filtro. Por uma questão de simplicidade, ignoraremos a correção gama .
Por exemplo: as etapas do filtro Bayer para a frente "normal" são:
- uma bandeja de luz com uma cor de cera de abelha Pantone atinge o sensor;
- o filtro BGGR (azul - verde / verde - vermelho) decompõe isso em quatro raios.
- Os quatro raios atingem o sensor, que lê: 81 - 168/168 - 235 (os valores do sensor variam de 0 a 255);
- O filtro Bayer converte isso em um pixel RGB com cores (235, 168, 81).
As etapas reversas do filtro Bayer são:
- O pixel RGB com cores (235, 168, 81) é dividido em quatro pixels com valores RGB: (0,0,81) - (0,168,0) / (0,168,0) - (235,0,0).
Desafio
Você deve escrever a função ou programa mais curto possível que faça o seguinte:
- Pegue um nome de arquivo como na entrada e emita a imagem DeBayered.
- A saída pode ser gravada em um arquivo ou exibida na tela.
- A saída deve ter o dobro da largura e o dobro da altura da imagem original.
Cada pixel da imagem de entrada deve ser mapeado de acordo com o padrão de filtro Bayer BGGR (Azul - Verde / Verde - Vermelho), conforme explicado graficamente na figura a seguir:
Assumiremos que os dois fotossensores verdes recebem o mesmo sinal; portanto, os valores G na matriz Bayer são iguais ao valor G na imagem RGB.
- Você não pode retornar uma representação de matriz da imagem resultante. A saída deve ser uma imagem ou um arquivo (em qualquer formato de imagem adequado ) que possa ser exibido como uma imagem.
Exemplo
Dado este arquivo como uma entrada:
A imagem resultante deve ser:
Implementação python de referência:
from PIL import Image
import numpy
import sys
if len(sys.argv) == 1:
print "Usage: python DeByer.py <<image_filename>>"
sys.exit()
# Open image and put it in a numpy array
srcArray = numpy.array(Image.open(sys.argv[1]), dtype=numpy.uint8)
w, h, _ = srcArray.shape
# Create target array, twice the size of the original image
resArray = numpy.zeros((2*w, 2*h, 3), dtype=numpy.uint8)
# Map the RGB values in the original picture according to the BGGR pattern#
# Blue
resArray[::2, ::2, 2] = srcArray[:, :, 2]
# Green (top row of the Bayer matrix)
resArray[1::2, ::2, 1] = srcArray[:, :, 1]
# Green (bottom row of the Bayer matrix)
resArray[::2, 1::2, 1] = srcArray[:, :, 1]
# Red
resArray[1::2, 1::2, 0] = srcArray[:, :, 0]
# Save the imgage
Image.fromarray(resArray, "RGB").save("output.png")
Lembre-se: este é um código de golfe , então o código mais curto vence!
fonte
BG
na linha superior eGR
na parte inferior, enquanto a imagem de exemplo é exibidaRG
na parte superior eGB
na parte inferior. Isso significa que qualquer arranjo que coloque as duas células verdes na diagonal é aceitável? (os outros seriam GB / RG e GR / BG).Respostas:
Pitão, 26 bytes
Espera o nome do arquivo de entrada com aspas em stdin e grava em
o.png
. Exemplo de saída:fonte
Matlab,
10492 bytesIsso faz uso da representação em matriz / matriz 3d de imagens RGB no Matlab, bem como do produto Kronecker, que é exatamente o que precisamos para criar esse novo "metapixel" 2x2 de cada pixel de origem. A saída é exibida em uma janela pop-up.
Captura de tela redimensionada:
fonte
[1:2;2:3]==n
é esperto! Você não pode removerb=[a,a;a,a];
?Python 3,
259254 bytesO nome do arquivo de entrada é fornecido na entrada padrão. Saídas para
o.png
.Exemplo de uso:
fonte
Mathematica
118127 bytesO envio original usou uma imagem real como entrada. Isso usa um nome de arquivo.
Aplica duas regras de substituição aos dados da imagem do arquivo referenciado:
Então
Riffle
(ou seja, intercalar) as matrizes resultantes de 1 e 2.fonte
J,
1009690 bytesEste é um script em J que lê o nome do arquivo da imagem de entrada de stdin e gera o resultado em um arquivo chamado
o
. As imagens de entrada e saída estarão nobmp
formato. Ele também espera que apenas o nome do arquivo seja inserido, significando que os espaços em branco à esquerda e à direita não devem estar presentes.Uso da amostra
Explicação
fonte
Python 2,
256275 bytesPrimeiro, simplifiquei o código original:
Minimize para:
Resultando na imagem
o.png
:fonte