Histogramm für jeden Bildkanal berechnen
Der Bildhistogramm-Rechner wandelt nach Kanälen getrennte Pixelwerte in kompakte Häufigkeitsverteilungen um.
Im Browser ausführen – kostenlos
Läuft direkt in Ihrem Browser – kostenlos. Ihre Datei verlässt Ihren Browser nicht und wird an keinen Server übertragen.
Geben Sie mindestens einen benannten Kanal an, wählen Sie die Anzahl der Klassen und erhalten Sie für jeden Kanal eine geordnete Zählliste. Das eignet sich für bereits dekodierte Bilder, wenn Sie reproduzierbare Statistiken benötigen, ohne die Originaldatei hochzuladen oder erneut zu kodieren. Jeder Wert wird im 8-Bit-Bereich geprüft, jedes Pixel genau einer Klasse zugeordnet und eine leere Pixelliste als Fehler abgewiesen.
Bereiten Sie benannte Kanalwerte vor
Übergeben Sie die dekodierten Pixel im Array channels. Jeder Eintrag benötigt einen eindeutigen Kanalnamen und ein Array values mit ganzzahligen Intensitäten von 0 bis 255. Bezeichnungen wie red, green, blue, alpha und gray sind üblich, der Rechner schreibt jedoch kein Farbmodell vor; jede Komponente mit demselben 8-Bit-Wertebereich ist zulässig. Die Reihenfolge der Werte beeinflusst das Histogramm nicht, da nur ihre Häufigkeit zählt. Jeder Kanal muss mindestens einen Pixelwert enthalten. Die Anfrage wird abgelehnt, wenn die äußere Liste oder ein values-Array leer ist, ein Name fehlt oder doppelt vorkommt oder ein Wert gebrochen beziehungsweise außerhalb des Bereichs liegt. Diese Prüfungen verhindern, dass unvollständige Quelldaten wie eine gültige Verteilung wirken. Zulässig sind bis zu sechzehn Kanäle und eine Million Werte je Kanal.
Verstehen Sie die Klassengrenzen
Wählen Sie eine ganzzahlige Klassenanzahl von 1 bis 256 oder lassen Sie die Angabe weg, um 16 Klassen zu verwenden. Der vollständige 8-Bit-Intensitätsbereich wird von 0 bis 255 in gleich breite Intervalle geteilt. Bei 16 Klassen umfasst die erste die Werte 0 bis 15, die zweite 16 bis 31 und die letzte 240 bis 255. Allgemein ergibt sich der Index als abgerundeter Wert aus Pixelwert mal Klassenanzahl geteilt durch 256. Der obere Endpunkt wird ausdrücklich in der letzten Klasse gehalten, sodass 255 nie außerhalb des Arrays liegt. Diese Festlegung bleibt auch dann deterministisch, wenn die gewählte Anzahl 256 nicht ohne Rest teilt. Jedes Pixel erhöht genau einen Zähler; deshalb entspricht die Summe aller Zähler eines Kanals stets dessen pixel_count.
Lesen und prüfen Sie das Ergebnis
Die Antwort enthält bins, die festen Grenzen value_min und value_max sowie ein Histogrammobjekt für jeden Eingabekanal. Jedes Objekt behält den Kanalnamen bei, nennt pixel_count und liefert counts in aufsteigender Intensitätsreihenfolge. Die erste Position steht stets für das dunkelste, die letzte für das hellste Intervall, wodurch sich die Arrays leicht darstellen und vergleichen lassen. Addieren Sie counts und prüfen Sie, ob die Summe pixel_count entspricht; der Algorithmus garantiert diese Eigenschaft, und die Kontrolle kann Kürzungen an anderer Stelle Ihrer Verarbeitungskette sichtbar machen. Histogramme fassen Häufigkeiten zusammen, nicht die räumliche Anordnung. Daher können sehr unterschiedliche Bilder dasselbe Ergebnis besitzen. Die Funktion dekodiert keine Dateien, erkennt keine Farbräume, normalisiert keine Belichtung und verbindet keine Kanäle. Dekodieren Sie zunächst die Quelle. Im Browser bleiben die Daten lokal; die API-Automatisierung kostet $0.002 je Anfrage.
Anwendungsfälle
Farbverteilungen vergleichen
Erzeugen Sie gleich eingeteilte Zählwerte für Rot, Grün und Blau, bevor Sie dekodierte Bilder miteinander vergleichen.
Belichtungsextreme erkennen
Untersuchen Sie die ersten und letzten Klassen, um von Schatten oder Lichtern dominierte Kanäle zu finden.
Bildverarbeitung kontrollieren
Speichern Sie deterministische Histogramme vor und nach einer Umwandlung, um unerwartete Tonwertänderungen aufzudecken.
Häufige Fragen
Was kostet die Ausführung?
Eine Ausführung per API kostet $0.002 je Anfrage. Dieselbe deterministische Berechnung ist auch in Ihrem Browser möglich.
Welche Pixelwerte sind zulässig?
Jeder Wert muss eine ganze Zahl von 0 bis 255 sein und damit einem 8-Bit-Bildkanal entsprechen.
Was geschieht bei einer leeren Pixelliste?
Die Anfrage schlägt mit einem Fehler für ungültige Eingaben fehl; eine leere Liste erzeugt kein Histogramm aus Nullen.
Wie werden Werte verteilt, wenn die Klassen 256 nicht teilen?
Der Index wird aus value mal bins geteilt durch 256 abgerundet; 255 verbleibt ausdrücklich in der letzten Klasse.
Werden PNG-, JPEG- oder WebP-Dateien dekodiert?
Nein. Stellen Sie bereits dekodierte Pixelwerte in Arrays mit benannten Kanälen bereit.
Dürfen Kanäle unterschiedlich viele Pixel enthalten?
Ja. Jeder Kanal wird unabhängig gezählt und meldet seinen eigenen pixel_count.
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem 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)Beispiel-Anfrage
{
"channels": [
{
"channel": "red",
"values": [
0,
15,
16,
127,
128,
240,
255
]
},
{
"channel": "green",
"values": [
0,
64,
64,
128,
192,
255
]
}
]
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.histogram",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Limits
max_channels | 16 |
max_values_per_channel | 1000000 |
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |