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!
BG
na linha superior e GR
na parte inferior, enquanto a imagem de exemplo é exibida RG
na parte superior e GB
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).