画像の各チャンネルのヒストグラムを計算
画像ヒストグラム計算機は、チャンネルごとに分けた画素値を簡潔な度数分布へ変換します。名前付きチャンネルを1つ以上指定し、階級数を選ぶと、各チャンネルの度数配列が昇順で返されます。画像をすでにデコードしており、元のファイルをアップロードしたり再エンコードしたりせずに、再現可能な統計が必要な場合に適しています。すべての値を8ビット範囲で検査し、各画素を必ず1つの階級へ割り当てます。空の画素リストは誤解を招くゼロ配列にせず、エラーとして扱います。
無料で実行
処理はブラウザ内で完結します。ファイルは送信されません。無料でご利用いただけます。
チャンネル別の画素値を準備します
デコード済みの画素をchannels配列で指定してください。各要素には一意のチャンネル名と、0から255までの整数強度を格納したvalues配列が必要です。red、green、blue、alpha、grayなどの名前が一般的ですが、特定のカラーモデルには限定されません。同じ8ビット範囲を使う成分であれば処理できます。ヒストグラムでは頻度だけを数えるため、値の並び順は結果に影響しません。各チャンネルには少なくとも1つの画素値が必要です。外側の配列またはvaluesが空の場合、名前が未指定または重複している場合、値が小数または範囲外の場合は、入力エラーになります。この検査により、不完全なデータが正しい分布に見えることを防ぎます。最大16チャンネル、各チャンネル最大1000000個の値を処理できます。
階級への割り当て方法を確認します
階級数には1から256までの整数を指定してください。省略すると16階級になります。8ビットの全強度範囲を、0から255まで等幅の区間に分けます。16階級の場合、最初は0から15、次は16から31、最後は240から255を数えます。一般には、画素値に階級数を掛けて256で割り、その小数部分を切り捨てた値が階級番号です。上限値は明示的に最後の階級へ収めるため、255が配列外になることはありません。選んだ階級数で256を割り切れない場合も、この定義により常に同じ結果が得られます。各画素は1つのカウンターだけを増やすので、チャンネル内の全カウントの合計はpixel_countと一致します。概要には少ない階級、細かな濃淡の分析には多い階級が適しています。
結果を読み取り、比較して検証します
応答には、選択したbins、固定範囲のvalue_minとvalue_max、入力チャンネルごとのヒストグラムオブジェクトが含まれます。各オブジェクトはチャンネル名を保持し、pixel_countと強度の昇順に並んだcountsを返します。先頭は常に最も暗い区間、末尾は最も明るい区間なので、グラフ化や比較を容易に行えます。countsを合計し、pixel_countと一致することを確認すれば、別の処理段階で生じた欠落を検出できます。ヒストグラムが示すのは頻度であり、画素の空間配置ではありません。そのため、見た目が異なる画像でも同じ結果になる場合があります。ファイルのデコード、色空間の推定、露出の正規化、チャンネルの合成は行いません。先に画像をデコードし、この機能を集計工程にご利用ください。ブラウザーではデータを端末内で処理し、API自動化は1回$0.002です。
活用例
色チャンネルの分布を比較
デコード済み画像の差を測る前に、赤、緑、青を同じ階級数で集計できます。
露出の両端を検出
最初と最後の階級を調べ、暗部または明部に偏ったチャンネルを特定できます。
画像処理工程を検証
変換の前後で再現可能なヒストグラムを記録し、予期しない階調変化を検出できます。
よくある質問
料金はいくらですか?
API実行は1回$0.002です。同じ決定的な計算をブラウザーでも実行できます。
どの画素値を使用できますか?
8ビット画像チャンネルに対応する0から255までの整数を指定してください。
画素リストが空の場合はどうなりますか?
無効な入力としてエラーになります。空のリストから全要素がゼロのヒストグラムを作ることはありません。
階級数で256を割り切れない場合はどう分類しますか?
valueにbinsを掛けて256で割った値を切り捨て、255は必ず最後の階級に収めます。
PNG、JPEG、WebPファイルをデコードできますか?
いいえ。あらかじめデコードし、名前付きチャンネル配列に分けた画素値をご用意ください。
チャンネルごとに画素数が異なってもよいですか?
はい。各チャンネルを個別に集計し、それぞれのpixel_countを返します。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
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)リクエスト例
{
"channels": [
{
"channel": "red",
"values": [
0,
15,
16,
127,
128,
240,
255
]
},
{
"channel": "green",
"values": [
0,
64,
64,
128,
192,
255
]
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.histogram",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_channels | 16 |
max_values_per_channel | 1000000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |