Calculez l’histogramme de chaque canal d’une image
Le calculateur d’histogramme d’image transforme des valeurs de pixels réparties par canal en distributions de fréquences compactes.
Lancer gratuitement
Tout se passe dans votre navigateur : gratuit, sans envoi de vos données.
Indiquez un ou plusieurs canaux nommés, choisissez le nombre de classes et obtenez une liste ordonnée de comptes pour chaque canal. Cet outil convient lorsque l’image est déjà décodée et que vous souhaitez des statistiques reproductibles sans téléverser ni réencoder le fichier d’origine. Chaque valeur est contrôlée dans la plage 8 bits, chaque pixel rejoint une seule classe et toute liste vide provoque une erreur.
Préparez les valeurs de chaque canal
Transmettez les pixels décodés dans le tableau channels. Chaque élément doit comporter un nom de canal unique et un tableau values d’intensités entières comprises entre 0 et 255. Les noms red, green, blue, alpha et gray sont courants, mais le calculateur n’impose aucun modèle colorimétrique : tout composant utilisant le même domaine 8 bits convient. L’ordre des valeurs n’influence pas l’histogramme, puisque seule leur fréquence compte. Chaque canal doit contenir au moins un pixel. La requête est refusée si la liste externe ou une liste values est vide, si un nom manque ou apparaît deux fois, ou si une valeur est décimale ou hors limites. Ces contrôles évitent qu’une source incomplète ressemble à une distribution valable. Vous pouvez fournir jusqu’à seize canaux et un million de valeurs par canal.
Comprenez le classement des intensités
Choisissez un nombre entier de classes compris entre 1 et 256, ou omettez ce réglage pour en utiliser 16. Le domaine complet des intensités 8 bits est partagé en intervalles de même largeur, de 0 à 255. Avec 16 classes, la première compte les valeurs de 0 à 15, la deuxième celles de 16 à 31 et la dernière celles de 240 à 255. En règle générale, l’indice correspond à la partie entière inférieure de la valeur multipliée par le nombre de classes puis divisée par 256. La borne supérieure est explicitement conservée dans la dernière classe, si bien que 255 n’est jamais perdu. La définition reste déterministe même si le nombre choisi ne divise pas 256 exactement. Chaque pixel incrémente un seul compteur et leur somme correspond donc à pixel_count.
Lisez, comparez et vérifiez le résultat
La réponse fournit bins, les limites fixes value_min et value_max, ainsi qu’un objet d’histogramme par canal reçu. Chaque objet conserve le nom du canal, indique pixel_count et renvoie counts par intensité croissante. La première position représente toujours l’intervalle le plus sombre et la dernière le plus clair, ce qui simplifie les graphiques et les comparaisons. Additionnez counts et vérifiez que le total égale pixel_count afin de repérer une éventuelle troncature dans votre chaîne de traitement. Un histogramme résume des fréquences, pas l’organisation spatiale : deux images visuellement différentes peuvent donc produire le même résultat. L’outil ne décode pas les fichiers, ne détermine pas l’espace colorimétrique, ne normalise pas l’exposition et ne fusionne pas les canaux. Décodez d’abord la source, puis utilisez cette capacité pour le comptage. Dans le navigateur, les données restent locales ; l’automatisation par API coûte $0.002 par requête.
Cas d’usage
Comparer les distributions colorimétriques
Produisez des comptes identiques pour le rouge, le vert et le bleu avant de mesurer les écarts entre deux images décodées.
Détecter les extrêmes d’exposition
Examinez les premières et dernières classes afin de repérer les canaux dominés par les ombres ou les hautes lumières.
Contrôler une chaîne de traitement
Enregistrez des histogrammes déterministes avant et après une transformation pour détecter toute variation tonale inattendue.
Questions fréquentes
Quel est le tarif ?
Une exécution via l’API coûte $0.002 par requête. Le même calcul déterministe peut aussi être effectué dans votre navigateur.
Quelles valeurs de pixels sont acceptées ?
Chaque valeur doit être un entier compris entre 0 et 255, conformément à un canal d’image 8 bits.
Que se passe-t-il si une liste de pixels est vide ?
La requête échoue avec une erreur d’entrée incorrecte ; une liste vide ne produit jamais un histogramme rempli de zéros.
Comment classer les valeurs si le nombre de classes ne divise pas 256 ?
L’indice est la partie entière inférieure de value multipliée par bins puis divisée par 256, et 255 reste dans la dernière classe.
Cet outil décode-t-il les fichiers PNG, JPEG ou WebP ?
Non. Vous devez fournir des pixels déjà décodés et organisés en tableaux de canaux nommés.
Les canaux peuvent-ils contenir des nombres de pixels différents ?
Oui. Chaque canal est compté séparément et possède son propre pixel_count.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/image/histogram \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"channels":[{"channel":"red","values":[0,15,16,127,128,240,255]},{"channel":"green","values":[0,64,64,128,192,255]}]}'const res = await fetch("https://api.kit.forhosting.com/image/histogram", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"channels": [
{
"channel": "red",
"values": [
0,
15,
16,
127,
128,
240,
255
]
},
{
"channel": "green",
"values": [
0,
64,
64,
128,
192,
255
]
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/histogram",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"channels": [
{
"channel": "red",
"values": [
0,
15,
16,
127,
128,
240,
255
]
},
{
"channel": "green",
"values": [
0,
64,
64,
128,
192,
255
]
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/histogram", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"channels":[{"channel":"red","values":[0,15,16,127,128,240,255]},{"channel":"green","values":[0,64,64,128,192,255]}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"channels":[{"channel":"red","values":[0,15,16,127,128,240,255]},{"channel":"green","values":[0,64,64,128,192,255]}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/histogram", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"channels": [
{
"channel": "red",
"values": [
0,
15,
16,
127,
128,
240,
255
]
},
{
"channel": "green",
"values": [
0,
64,
64,
128,
192,
255
]
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.histogram",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_channels | 16 |
max_values_per_channel | 1000000 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |