Modifier le contraste de l'image dans l'PIL
J'ai un programme qui est censé modifier le contraste, mais je sens que c'est pas vraiment changer le contraste.Il modifie certaines zones de rouge alors que je ne veux pas que ça. Si vous pouviez me dire comment faire pour les supprimer, merci.
Voici le code:
from PIL import Image
def change_contrast(img, level):
img = Image.open("C:\\Users\\omar\\Desktop\\Site\\Images\\obama.png")
img.load()
factor = (259 * (level+255)) / (255 * (259-level))
for x in range(img.size[0]):
for y in range(img.size[1]):
color = img.getpixel((x, y))
new_color = tuple(int(factor * (c-128) + 128) for c in color)
img.putpixel((x, y), new_color)
return img
result = change_contrast('C:\\Users\\omar\\Desktop\\Site\\Images\\test_image1.jpg', 100)
result.save('C:\\Users\\omar\\Desktop\\Site\\Images\\test_image1_output.jpg')
print('done')
Et voici l'image et son résultat:
Si c'est la méthode de contraste, n'hésitez pas à me dire
- Je ne peux pas reproduire ce. J'ai essayé votre code et de l'image de sortie est semble ok. i.stack.imgur.com/QhR3n.jpg
- Votre code contient deux tentatives de chargement d'une image d'entrée, cependant. Vous
test_image1.jpg
ne sera pas utilisé, puisque vous avezobama.png
codées en dur dans le corps de la fonction. Êtes-vous sûr que vous utilisez le fichier d'entrée-vous que vous utilisez?
Vous devez vous connecter pour publier un commentaire.
Je n'arrivais pas à reproduire votre bug. Sur ma plate-forme (debian) seulement l'Oreiller de la fourche est disponible, donc si vous utilisez l'ancien PIL paquet, qui pourraient être la cause.
En tout cas, il y a une méthode intégrée
de l'Image.point()
pour faire ce genre d'opération. Il sera en correspondance de chaque pixel dans chaque canal, ce qui devrait être plus rapide que de faire trois boucles imbriquées en python.Votre sortie semble que vous avez un débordement dans un seul canal (rouge). Je ne vois pas pourquoi ça pourrait arriver. Mais si votre
level
est supérieur à 259, la sortie est inversée. Quelque chose comme ce qui est probablement la cause de la première bug.Une solution possible est de s'assurer que le contraste filtre uniquement les valeurs de retour au sein de la gamme [0-255], depuis le bug semble être causée par des valeurs négatives déborde en quelque sorte.
Il y a déjà construit une classe appelée le contraste dans PIL module. Vous pouvez simplement l'utiliser.
contrast.enhance()
méthode pour plus d'contratsed puis celui d'origine. Passer l'utilisateur choisit d'en améliorer la méthode. Laissez-moi savoir si cela fonctionne .contrast = ImageEnhance.Contrast(image)
alors, à ce que j'applique:contrast_applied=contrast._Enhance(scale_value)
et l'utilisation de la.get()
fonction de l'échelle commescale_value=scale1.get()
Et cela devrait fonctionner. Je vais mettre à jour une fois que je suis fait.