Casi todos los sensores de cámaras digitales están organizados en una cuadrícula de fotosensores. Cada sensor fotográfico es sensible a uno de los colores primarios : rojo, verde y azul. La forma en que se organizan esos sensores fotográficos se denomina filtro Bayer , en honor a su inventor, Bryce Bayer, de Eastman Kodak. Después de tomar una imagen, cuatro fotosensores componen el valor RGB de un píxel en la imagen resultante. Su tarea es revertir ese proceso y colorear los píxeles resultantes de acuerdo con su color de filtro. En aras de la simplicidad, ignoraremos la corrección gamma .
Por ejemplo: los pasos de filtro Bayer "normales" hacia adelante son:
- una bandeja liviana con un color Pantone Beeswax golpea el sensor;
- El filtro BGGR (Azul - Verde / Verde - Rojo) lo descompone en cuatro rayos.
- Los cuatro rayos golpean el sensor, que dice: 81 - 168/168 - 235 (los valores del sensor oscilan entre 0 y 255);
- El filtro Bayer traduce esto a un píxel RGB con color (235, 168, 81).
Los pasos inversos del filtro Bayer son:
- El píxel RGB con color (235, 168, 81) se divide en cuatro píxeles con valores RGB: (0,0,81) - (0,168,0) / (0,168,0) - (235,0,0).
Desafío
Debe escribir la función o programa más corto posible que haga lo siguiente:
- Tome un nombre de archivo como entrada y salida de la imagen DeBayered.
- El resultado puede escribirse en un archivo o mostrarse en la pantalla.
- El resultado debe ser el doble del ancho y el doble de la altura de la imagen original.
Cada píxel de la imagen de entrada debe asignarse de acuerdo con el patrón de filtro BGGR (Azul - Verde / Verde - Rojo) de BGGR como se explica gráficamente en la siguiente imagen:
Asumiremos que ambos fotosensores verdes reciben la misma señal, por lo que ambos valores G en la matriz de Bayer son iguales al valor G en la imagen RGB.
- Es posible que no devolver un matriz como representación de la imagen resultante. La salida debe ser una imagen o un archivo (en cualquier formato de imagen adecuado ) que se pueda mostrar como una imagen.
Ejemplo
Dado este archivo como entrada:
La imagen resultante debe ser:
Implementación de Python de referencia:
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")
Recuerde: este es un código de golf , por lo que gana el código más corto
fuente
BG
en la fila superior yGR
en la parte inferior, mientras que la imagen de ejemplo se muestraRG
en la parte superior eGB
inferior. ¿Eso significa que cualquier arreglo que ponga las dos celdas verdes en diagonal es aceptable? (los otros serían GB / RG y GR / BG.)Respuestas:
Pyth, 26 bytes
Espera el nombre de archivo de entrada con comillas en stdin y escribe en
o.png
. Salida de ejemplo:fuente
Matlab,
10492 bytesEsto hace uso de la representación de matriz 3D / matriz de imágenes RGB en Matlab, así como el producto Kronecker, que es exactamente lo que necesitamos para crear este nuevo "metapíxel" de 2x2 desde cada píxel de origen. La salida se muestra en una ventana emergente.
Captura de pantalla redimensionada:
fuente
[1:2;2:3]==n
es inteligente! ¿No puedes eliminarb=[a,a;a,a];
?Python 3,
259254bytesEl nombre de archivo de entrada se proporciona en la entrada estándar. Salidas a
o.png
.Ejemplo de uso:
fuente
Mathematica
118127 bytesLa presentación original utilizaba una imagen real como entrada. Esto utiliza un nombre de archivo en su lugar.
Aplica dos reglas de reemplazo a los datos de imagen del archivo referenciado:
Luego
Riffle
(es decir, intercalar) las matrices resultantes de 1 y 2.fuente
J,
1009690 bytesEste es un script en J que lee el nombre de archivo de la imagen de entrada desde stdin y genera el resultado en un archivo llamado
o
. Las imágenes de entrada y salida estarán enbmp
formato. También espera que solo se ingrese el nombre de archivo, lo que significa que los espacios en blanco iniciales y finales no deben estar presentes.Uso de muestra
Explicación
fuente
Python 2,
256275 bytesPrimero simplifiqué el código original:
Luego minimiza a:
Resultando en la imagen
o.png
:fuente