Filtro reverso Bayer de uma imagem

Quase todos os sensores de câmeras digitais são organizados em uma grade de fotossensores. Cada fotossensor é sensível a uma das cores primárias : vermelho, verde e azul. A forma como esses fotossensores são organizados é chamada de filtro Bayer , em homenagem ao seu inventor, Bryce Bayer da Eastman Kodak. Depois que uma imagem é tirada, quatro fotossensores 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. Para fins de simplicidade, iremos ignorar a correção de gama .

Por exemplo: as etapas “normais” do filtro Bayer direto são:

  • um farol com uma cor Pantone de cera de abelha atinge o sensor;
  • o BGGR (azul – verde / verde – O filtro vermelho decompõe isso em quatro raios.
  • Os quatro raios atingem o sensor, que mostra: 81 – 168/168 – 235 (os valores do sensor variam de 0 a 255);
  • O filtro Bayer traduz isso para um pixel RGB com cor (235, 168, 81).

As etapas do filtro Bayer reverso são:

  • pixel RGB com cor (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 saída da imagem DeBayered .
  • A saída pode ser gravada em um arquivo ou exibida na tela.
  • T 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 filtro Bayer BGGR (Azul – Verde / Verde – Vermelho) padrão conforme explicado graficamente na figura a seguir:

    Filtro Bayer - BGGR - explicação gráfica

  • Assumiremos que ambos os fotossensores verdes recebem o mesmo sinal, de modo que os valores G na matriz Bayer são iguais ao valor G na imagem RGB.

  • Você não pode retornar uma representação de array da imagem resultante. A saída deve ser uma imagem ou um arquivo (em qualquer formato de imagem adequado ) que pode ser exibido como uma imagem.

Exemplo

Dado este arquivo como entrada:

Mona Lisa

A imagem resultante deve ser:

DeBayered Mona Lisa

Implementação de referência do python:

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 , então o código mais curto vence!

Comentários

  • Quase tive uma convulsão quando rolei
  • @Fatalize desculpe por isso! 😉 Efeito estranho, não ‘ é?
  • As instruções mostram uma célula com BG no topo linha e GR na parte inferior, enquanto a imagem de exemplo mostra RG na parte superior e GB no fundo. Isso significa que qualquer arranjo que coloque as duas células verdes em uma diagonal é aceitável? (os outros seriam GB / RG e GR / BG.)
  • @LevelRiverSt minha intenção era aderir ao BGGR (conforme especificado no quarto item do desafio). Meu erro se a imagem de exemplo real estiver em RGGB. Eu ‘ corrigirei isso assim que ‘ estiver no meu laptop.
  • Eu não ‘ Não acho que sua imagem de exemplo esteja correta, por exemplo, ela tem uma tonalidade estranha de azul

Resposta

Pyth, 26 bytes

[email protected],U2tU3" 

Espera o nome do arquivo de entrada com aspas em stdin e grava em o.png. Exemplo de saída:

Comentários

  • Sua resposta é a mais curta até agora. Eu tendo a aceitar, mas seria bom se você pudesse adicionar uma explicação de como o seu programa funciona.
  • Acabei de usar o produto Kronecker, usando uma resposta de uma pergunta anterior: codegolf.stackexchange.com/questions/78797/… .

Resposta

Matlab, 104 92 bytes

Isso faz uso da representação 3d-array / matrix de imagens RGB no Matlab, bem como o produto Kronecker que é exatamente o que precisamos para criar este novo “metapixel” 2×2 de cada pixel de origem. A saída é exibida em uma janela pop-up.

a=double(imread(input("")));for n=1:3;b(:,:,n)=kron(a(:,:,n),[1:2;2:3]==n)/255;end;imshow(b) 

Captura de tela redimensionada:

Comentários

  • Que [1:2;2:3]==n é inteligente!Você pode ‘ remover b=[a,a;a,a];?
  • @LuisMendo Obrigado =) Funciona de fato, não ‘ Não espere isso!

Resposta

Python 3, 259 254 bytes

 from PIL.Image import* o=open(input()) w,h=o.size n=new("RGB",(2*w,2*h)) P=Image.putpixel for b in range(w*h):x=b//h;y=b%h;r,g,b=o.getpixel((x,y));c=2*x;d=2*y;G=0,g,0;P(n,(c,d),(0,0,b));P(n,(c+1,d),G);P(n,(c,d+1),G);P(n,(c+1,d+1),(r,0,0)) n.save("o.png")  

O nome do arquivo de entrada é fornecido em entrada padrão. Saídas para o.png.

Exemplo de uso:

$ echo mona-lisa.jpg | python bayer.py 

Mona Lisa com filtro Bayer reverso aplicado

Comentários

  • Bem-vindo ao PPCG, boa primeira resposta!

Resposta

Mathematica 118 127 bytes

O envio original usou uma imagem real como entrada. Em vez disso, usa um nome de arquivo.

Ele aplica duas regras de substituição aos dados de imagem do arquivo referenciado:

  1. Para cada linha da matriz de dados de imagem, substitua cada pixel { r, b, g} com um pixel azul, {0,0, b} seguido por um pixel verde, {0, g, 0};
  2. Separadamente, para cada linha da matriz de dados da imagem, substitua cada pixel {r, b, g} por um pixel verde {0, g, 0} seguido por um pixel vermelho, {r, 0,0};

Em seguida, Riffle (isto é, intercalar) as matrizes resultantes de 1 e 2.

Image[Riffle[#/.{{_,g_,b_}:>(s=Sequence)[{0,0,b},{0,g,0}]}&/@(m=Import[#,"Data"]/255),#/.{{r_,g_,_}:>s[{0,g,0},{r,0,0}]}&/@m]]& 

Image[Riffle[#/.{{_,g_,b_}:>(s=Sequence)[{0,0,b},{0,g,0}]}&/@(m=Import[#,"Data"]/255),#/.{{r_,g_,_}:>s[{0,g,0},{r,0,0}]}&/@m]]&["mona.jpg"] 

bayer reverso

Comentários

  • Não tenho certeza, mas isso não ‘ t parece satisfazer ” Pegue um nome de arquivo como na entrada
  • agtoever, agora usa como entrada um nome de arquivo em vez de uma imagem.

Resposta

J, 100 9 6 90 bytes

load"bmp" "o"writebmp~,./,./($a)$2 1 1 0(_2]\(2^0 8 8 16)*{)"1(3#256)#:,a=:readbmp]stdin"" 

Este é um script em J que lê o nome do arquivo da imagem de entrada de stdin e envia o resultado para um arquivo chamado o. As imagens de entrada e saída estarão no formato bmp. Ele também espera que apenas o nome do arquivo seja inserido, o que significa que espaços em branco à esquerda e à direita não devem estar presentes.

Exemplo de uso

$ echo -n mona.bmp | jconsole reversebayer.ijs 

Amostra

Explicação

A=:readbmp]stdin"" Store the image in A as a 2d array of 24-bit rgb ints , Flatten it into a list (3#256) #: Convert each 24-bit int to a tuple of 8-bit r/g/b ints 2 1 1 0 {"1 Select each column in BGGR order (2^0 8 8 16) * Shift each color to make it a 24-bit rgb value _2 ]\ Convert each row from dimensions 1x4 to 2x2 ($A) $ Reshape the list of 2x2 matrices into a matrix of 2x2 matrices with dimensions matching A ,./ Append the 2x2 matrices by column ,./ Append the 2x2 matrices by row - This is now a matrix of 24-bit rgb values with twice the dimensions of A "o"writebmp~ Write the image array to a bmp file named "o" 

Resposta

Python 2, 256 275 bytes

Primeiro, simplifiquei o código original:

from PIL import Image from numpy import* import sys # Open image and put it in a numpy array srcArray = array(Image.open(sys.argv[1]), dtype=uint8) w, h, _ = srcArray.shape # Create target array, twice the size of the original image resArray = zeros((2*w, 2*h, 3), dtype=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("o.png") 

Em seguida, reduza para:

from PIL import Image from numpy import* import sys a=array(Image.open(sys.argv[1]),dtype=uint8) w,h,_=a.shape b=zeros((2*w,2*h,3),dtype=uint8) b[::2,::2,2]=a[:,:,2] b[1::2,::2,1]=a[:,:,1] b[::2,1::2,1]=a[:,:,1] b[1::2,1::2,0]=a[:,:,0] Image.fromarray(b,"RGB").save("o.png") 

Resultando na imagem o.png:

imagem o.png após processamento

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *