Comment faire pour vérifier si un fichier jpeg de l'image est en couleur ou en niveaux de gris en utilisant uniquement Python stdlib
Je dois écrire un cas de test en python afin de vérifier qu'une image jpg est en couleur ou en niveaux de gris. Quelqu'un peut s'il vous plaît laissez-moi savoir si il y a moyen de le faire avec l'installation de bibliothèques supplémentaires comme opencv?
Questions: a) Que les bibliothèques ne sont pas considérés comme des bibliothèques supplémentaires? NumPy/Scipy? b) voulez-vous simplement détecter des 2 vs 3 canaux et de l'utiliser comme vos critères de niveaux de gris ou vous avez 3 canal des images qui sont en fait des niveaux de gris dans l'apparence?
Nous n'avons que la version 2.6 de python sur notre linux postes de travail. Il y a des instructions strictes de ne pas utiliser les bibliothèques externes à écrire des cas de test. Donc nous n'avons pas les autorisations pour installer les bibliothèques. Nous avons des 3 canaux images qui sont en fait des niveaux de gris dans l'apparence.
Avez-vous des aucun moyen de l'ouverture d'une image en pixels? Si non cela va être un problème difficile.
Rançon: vous voulez dire que vous ne pouvez pas simplement faire confiance à la JPEG en-tête, compensé 6: nombre de composants (1 = niveau de gris, 3 = RGB) ?
Je suppose que les niveaux de gris des images Jpeg sont si rares que je ne me souvenais pas que c'était possible. Il y aura aussi des cas où une image en niveaux de gris est enregistré avec 3 composants.
Nous n'avons que la version 2.6 de python sur notre linux postes de travail. Il y a des instructions strictes de ne pas utiliser les bibliothèques externes à écrire des cas de test. Donc nous n'avons pas les autorisations pour installer les bibliothèques. Nous avons des 3 canaux images qui sont en fait des niveaux de gris dans l'apparence.
Avez-vous des aucun moyen de l'ouverture d'une image en pixels? Si non cela va être un problème difficile.
Rançon: vous voulez dire que vous ne pouvez pas simplement faire confiance à la JPEG en-tête, compensé 6: nombre de composants (1 = niveau de gris, 3 = RGB) ?
Je suppose que les niveaux de gris des images Jpeg sont si rares que je ne me souvenais pas que c'était possible. Il y aura aussi des cas où une image en niveaux de gris est enregistré avec 3 composants.
OriginalL'auteur kadina | 2014-05-14
Vous devez vous connecter pour publier un commentaire.
Expansion @gat réponse:
Fondamentalement, consultez chaque pixel pour voir si elle est en niveaux de gris (R == G == B)
im
et de les tester? Ou de l'utilisation de l'arithmétique modulo pour parcourir l'image. Si l'échantillonnage (sans remplacement) de 100 aléatoire i,j-points n'est pas concluante, puis il suffit de le scanner de façon linéaire. Ou peut-être varier la ligne de commande avec l'arithmétique modulo. Vous pouvez rassembler tout cela dans un personnalisé itérateuriter_pixels(im)
.Désolé. Le code est un échec quand j'ai essayé d'exécuter le script et c'est ce qui donne l'erreur @ r,g,b = im.getpixel((i,j)) TypeError: 'int' object n'est pas itérable
Besoin d'ajouter rgb_im = im.convert('RGB')
si elle s'ouvre et n'est pas RVB alors que vous avez déjà votre réponse - je crois que la seule autre possibilité est en niveaux de gris. Au moins pour un JPEG.
par le temps de l'ouverture de l'image par la plupart des bibliothèques, la distinction est perdu.
OriginalL'auteur joaoricardo000
Peut être fait comme suit:
OriginalL'auteur superMind
Pour un traitement plus rapide, il est préférable d'éviter les boucles sur chaque pixel, en utilisant ImageChops, mais aussi pour être sûr que l'image est vraiment en niveaux de gris, nous avons besoin de comparer les couleurs sur chaque pixel et ne peut pas utiliser la somme):
OriginalL'auteur Karl K
La performance enhance pour des résultats rapides: depuis de nombreuses images en noir ou en blanc de la frontière, vous attendez plus rapide en cas de résiliation par l'échantillonnage un peu aléatoire i,j-points de la gi et de les tester? Ou de l'utilisation de l'arithmétique modulo pour traverser les lignes de l'image. Nous avons d'abord l'échantillon (sans remplacement) de 100 aléatoire i,j-points; dans le cas peu probable que n'est pas concluante, alors nous allons le scanner de façon linéaire.
À l'aide d'un custom itérateur iterpixels(im). Je n'ai pas PIL installé donc je ne peux pas le tester, voici le plan:
(Aussi mon premier commentaire stands, d'abord, vous vérifiez le format de l'en-tête, compensé 6: nombre de composants (1 = niveau de gris, 3 = RGB). Si c'est 1=niveaux de gris, vous connaissez la réponse déjà sans avoir besoin d'inspecter chacun des pixels.)
OriginalL'auteur smci
Pourquoi n'utilisons-nous pas ImageStat module?
stat.somme nous donne une somme de tous les pixels dans la vue liste = [R, G, B] par exemple [568283302.0, 565746890.0, 559724236.0]. Pour les niveaux de gris de l'image tous les éléments de la liste sont égaux.
OriginalL'auteur GriMel
Que vous avez probablement raison, OpenCV est peut-être trop pour cette tâche, mais il devrait être d'accord pour utiliser Python Image Library (PIL) pour cela. Les éléments suivants doivent travailler pour vous:
MODIFIER
Comme l'a souligné Mark et JRicardo000, vous pouvez effectuer une itération sur chaque pixel. Vous pouvez également faire usage de la messagerie instantanée.split() de la fonction ici.
Oui, vous avez raison. Permettez-moi de corriger cela dans un moment.
OriginalL'auteur gat