Filtre Bayer inversé dune image

Presque tous les capteurs dappareils photo numériques sont organisés en une grille de capteurs photo. Chaque capteur photo est sensible à lune des couleurs primaires : rouge, vert et bleu. La façon dont ces capteurs photo sont organisés est appelée le filtre Bayer , du nom de son inventeur, Bryce Bayer dEastman Kodak. Une fois limage prise, quatre capteurs photo composent la valeur RVB dun pixel dans limage résultante. Votre tâche consiste à inverser ce processus et à coloriser les pixels résultants en fonction de leur couleur de filtre. Par souci de simplicité, nous ignorerons la correction gamma .

Par exemple: les étapes « normales » du filtre Bayer avant sont:

  • un rayon lumineux avec une couleur Pantone Beeswax atteint le capteur;
  • le BGGR (bleu – vert / vert – Le filtre rouge) le décompose en quatre rayons.
  • Les quatre rayons frappent le capteur, qui lit: 81 – 168/168 – 235 (les valeurs du capteur vont de 0 à 255);
  • Le filtre Bayer traduit cela en un pixel RVB avec une couleur (235, 168, 81).

Les étapes du filtre Bayer inversé sont:

  • Pixel RVB avec la couleur (235, 168, 81) est divisé en quatre pixels avec des valeurs RVB: (0,0,81) – (0,168,0) / (0,168,0) – (235,0,0).

Challenge

Vous devez écrire la fonction ou le programme le plus court possible qui effectue les opérations suivantes:

  • Prenez un nom de fichier comme en entrée et sortez limage DeBayered .
  • La sortie peut être écrite dans un fichier ou affichée à lécran.
  • T La sortie doit être deux fois la largeur et deux fois la hauteur de limage originale.
  • Chaque pixel de limage dentrée doit être mappé selon le filtre Bayer BGGR (bleu – vert / vert – rouge) modèle comme expliqué graphiquement dans limage suivante:

    Filtre Bayer - BGGR - explication graphique

  • Nous supposerons que les deux capteurs photo verts reçoivent le même signal, de sorte que les deux valeurs G de la matrice Bayer sont égales à la valeur G de l’image RVB.

  • Vous ne pouvez pas renvoyer une représentation sous forme de tableau de limage résultante. Le résultat doit être une image ou un fichier (dans tout format dimage approprié ) qui peut être affiché sous forme dimage.

Exemple

Étant donné ce fichier en entrée:

Mona Lisa

Limage résultante doit être:

Mona Lisa DeBayered

Implémentation de python de référence:

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") 

Rappelez-vous: ceci est un , donc le code le plus court lemporte!

Commentaires

  • Jai presque eu une crise lorsque jai fait défiler
  • @Fatalize désolé pour ça! 😉 Effet bizarre, nest ‘ t-il?
  • Les instructions montrent une cellule avec BG en haut ligne et GR en bas, tandis que limage dexemple montre RG en haut et GB sur le fond. Cela signifie-t-il que tout arrangement qui place les deux cellules vertes sur une diagonale est acceptable? (les autres seraient GB / RG et GR / BG.)
  • @LevelRiverSt mon intention était dadhérer à BGGR (comme spécifié dans la quatrième puce de défi). Mon erreur si limage dexemple réelle est en RGGB. Je ‘ corrigerai cela dès que je ‘ m sur mon ordinateur portable.
  • Je ne ‘ Je ne pense pas que votre image dexemple est correcte, pour lune delle, elle a une teinte bleue bizarre

Réponse

Pyth, 26 octets

[email protected],U2tU3" 

Attend le nom du fichier dentrée entre guillemets sur stdin et écrit dans o.png. Exemple de sortie:

Commentaires

  • Votre réponse est la plus courte à ce jour. Jai tendance à laccepter, mais ce serait bien si vous pouviez ajouter une explication sur le fonctionnement de votre programme.
  • Je viens dutiliser le produit Kronecker, en utilisant une réponse à une question précédente: codegolf.stackexchange.com/questions/78797/… .

Réponse

Matlab, 104 92 octets

Cela utilise la représentation en matrice 3D des images RVB dans Matlab, ainsi que le produit Kronecker qui est exactement ce dont nous avons besoin pour créer ce nouveau « métapixel » 2×2 pour chaque pixel source. La sortie est ensuite affichée dans une fenêtre contextuelle.

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

Capture décran redimensionnée:

Commentaires

  • Que [1:2;2:3]==n est intelligent!Pouvez-vous ‘ supprimer b=[a,a;a,a];?
  • @LuisMendo Thanks =) Cela fonctionne effectivement, je nai pas ‘ Je mattends à ça!

Réponse

Python 3, 259 254 octets

 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")  

Le nom du fichier dentrée est donné dans entrée standard. Sorties vers o.png.

Exemple dutilisation:

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

Mona Lisa avec filtre Bayer inversé appliqué

Commentaires

  • Bienvenue dans PPCG, bonne première réponse!

Réponse

Mathematica 118 127 octets

La soumission originale utilisait une image réelle comme entrée. Cela utilise un nom de fichier à la place.

Il applique deux règles de remplacement aux données dimage du fichier référencé:

  1. Pour chaque ligne de la matrice de données dimage, remplacez chaque pixel { r, b, g} avec un pixel bleu, {0,0, b} suivi dun pixel vert, {0, g, 0};
  2. Séparément, pour chaque ligne de la matrice de données dimage, remplacer chaque pixel {r, b, g} par un pixel vert {0, g, 0} suivi dun pixel rouge, {r, 0,0};

Puis Riffle (cest-à-dire entrelacer) les matrices résultant de 1 et 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"] 

reverse bayer

Commentaires

  • Pas sûr, mais cela ‘ ne semble pas satisfaire  » Prendre un nom de fichier comme en entrée  »
  • agtoever, Il utilise maintenant comme entrée un nom de fichier au lieu dune image.

Réponse

J, 100 9 6 90 octets

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

Ceci est un script en J qui lit le nom de fichier de limage dentrée depuis stdin et renvoie le résultat dans un fichier nommé o. Les images dentrée et de sortie seront toutes deux au format bmp. Il sattend également à ce que seul le nom de fichier soit entré, ce qui signifie quaucun espace blanc de début et de fin ne doit être présent.

Exemple dutilisation

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

Exemple

Explication

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" 

Réponse

Python 2, 256 275 octets

Jai dabord simplifié le code dorigine:

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") 

Puis réduisez en:

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") 

Résultat de limage o.png:

Image o.png après traitement

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *