2009-05-11 8 views
3

J'ai deux fichiers JPEG et j'aimerais les superposer avec les mêmes résultats que le mode "Luminosité" disponible dans Photoshop (et Fireworks). Vous pouvez en savoir plus sur le mode Luminosité ici: http://www.adobetutorialz.com/articles/662/1/Photoshop%92s-Luminosity-ModeExécution du filtre "Luminosité" de Photoshop par programme

Comment est-ce que je peux faire ceci? Le langage de programmation n'a pas beaucoup d'importance, mais je parle couramment Python et PHP (dans cet ordre). Python Imaging Library semble être un ajustement parfait, mais la luminosité n'est pas une fonction intégrée et je ne connais pas la procédure appropriée. Voir http://effbot.org/imagingbook/imagechops.htm

Répondre

1

Je ne connais pas ce filtre spécifique mais je peux vous dire comment suivre les étapes de Coincoin dans PIL.Je ne l'ai pas fait courir le code, mais vous pouvez l'utiliser comme une référence:

charge la source et cible JPEGs

from PIL import Image 
img1 = Image.open('image1.jpg') 
img2 = Image.open('image2.jpg') 

Convertir les pixels de l'espace de couleur RVB à L une couleur b l'espace (ou tout autre espace de couleur avec des informations de luminosirty)

# Color matrix for Lab 
colorMatrix = (
    x1, y1, z1, 0, 
    x2, y2, z2, 0, 
    x3, y3, z3, 0 
) 
img1 = img1.convert("RGB", colorMatrix) 
img2 = img2.convert("RGB", colorMatrix) 

Conserver les canaux de couleurs cibles et de remplacer son canal de luminosité due à la luminosité de la source

l1, a1, b1 = img1.split() 
l2, a2, b2 = img2.split() 
img1.putdata(zip(l1.getdata(), a2.getdata(), b2.getdata())) 

reconvertir à l'espace RVB

# Color matrix for RGB 
RGBcolorMatrix = (
    x1, y1, z1, 0, 
    x2, y2, z2, 0, 
    x3, y3, z3, 0 
) 
img1 = img1.convert("RGB", RGBcolorMatrix) 

Enregistrer le fichier JPEG

img1.save('new_image.jpg') 
+0

Wow. JE VOUS REMERCIE. –

+0

En fait ... je déteste le dire, mais pouvez-vous expliquer la pièce colorMatrix avec x1, y1, z1? Evidemment, Python ne le permettra pas puisque ceux-ci ne sont pas définis lors de la compilation. Quels sont les vals que je suis censé utiliser à la place de ceux dans votre pseudo-code? –

+1

Vous voyez cette page pour plus de détails sur la fonction de conversion et comment l'utiliser http://www.pythonware.com/library/pil/handbook/image.htm –

0

Le Gimp serait une autre option - il a une interface de script et une API python - voici un article sur luminosity and the Gimp. Je ne sais pas si c'est le même effet que vous allez pour.

+0

Probablement pas votre faute, mais cette URL est pas accessible. –

5

Vous devez d'abord comprendre ce que fait Photoshop.

Il préserve les informations de couleur perceptives sous couche et remplace sa luminosité par les informations de luminosité perceptuelle de la couche supérieure. Pour ce faire, vous devez convertir les images dans l'espace de couleur approprié.

Voici la liste shoping des choses que vous devez faire si vous décidez de mettre en œuvre tout par vous-même:

  • charge à la fois la source et la cible JPEGs
  • Convertir les pixels de l'espace couleur RVB à L un espace de couleurs b (ou tout autre espace de couleur avec des informations de luminosirty)
  • Conserver les canaux de couleurs cibles et de remplacer son canal de luminosité due à la luminosité de la source
  • Convertir vers l'espace RGB
  • Enregistrer le fichier JPEG

Si vous pensez que Lab est trop compliqué, vous pouvez également utiliser l'espace couleur HSL, il est beaucoup plus simple, mais il donnera des résultats inférieurs.

1

En pseudo-code:

foreach rgb_pixel1, rgb_pixel2 in image1, image2 { 
    hsl1 = RgbToHsl(rgb_pixel1); 
    hsl2 = RgbToHsl(rgb_pixel2); 
    hsl3 = hsl(hsl1.h, hsl1.s, hsl2.l); 
    output_rgb = HslToRgb(hsl3); 
} 

Conversion de rgb à HSL et le dos est here.

+0

Je pense que je vais essayer ça en premier. Un autre intervenant a dit que la qualité de la TSL est inférieure, mais j'aimerais en juger avant de passer plus de temps. PIL ne supporte pas HSL, mais apparemment je peux obtenir des valeurs HSL pour un pixel RVB en utilisant colorsys: http://effbot.org/zone/pil-hsl.htm –

0

Vous pouvez jeter un oeil à la bibliothèque de traitement d'image OpenCV. Il a des liaisons Python et gère beaucoup de ces tâches de manipulation d'image de niveau inférieur pour vous, ou au moins les rend plus faciles.

Questions connexes