احسب المدرج التكراري لكل قناة في الصورة
تحوّل حاسبة المدرج التكراري للصورة قيم البكسل المفصولة حسب القناة إلى توزيعات تكرارية موجزة.
شغّل الأداة مجانًا
تعمل هذه الأداة داخل متصفحك — مجانًا، ولا تُرسل بياناتك إلى أي خادم
أدخل قناة مسماة واحدة أو أكثر، واختر عدد الفئات، لتحصل على مصفوفة مرتبة من الأعداد لكل قناة. تفيد هذه الأداة عندما تكون الصورة قد فُك ترميزها وتحتاج إلى إحصاءات قابلة للتكرار من دون رفع الملف الأصلي أو إعادة ترميزه. تُفحص كل قيمة ضمن نطاق 8 بت، ويُحتسب كل بكسل في فئة واحدة بالضبط، وتُرفض قائمة البكسلات الفارغة بدل إنتاج نتيجة مضللة كلها أصفار.
جهّز قيم القنوات المسماة
قدّم البكسلات التي فُك ترميزها في مصفوفة channels. يجب أن يحتوي كل عنصر على اسم قناة فريد ومصفوفة values تضم قيم شدة صحيحة من 0 إلى 255. الأسماء red وgreen وblue وalpha وgray شائعة، لكن الحاسبة لا تفرض نموذج ألوان محددًا؛ إذ يمكن استخدام أي مكوّن يعمل ضمن نطاق 8 بت نفسه. لا يؤثر ترتيب القيم في المدرج التكراري لأن التكرار وحده هو المهم. يجب أن تحتوي كل قناة على قيمة بكسل واحدة على الأقل. يُرفض الطلب إذا كانت قائمة القنوات أو إحدى مصفوفات values فارغة، أو كان الاسم مفقودًا أو مكررًا، أو كانت القيمة كسرية أو خارج النطاق. تمنع هذه الفحوص أن تبدو البيانات الناقصة كتوزيع صالح. يمكن تقديم ما يصل إلى ست عشرة قناة ومليون قيمة لكل قناة، وبذلك يظل التنفيذ في المتصفح وعبر API محدود الموارد.
افهم طريقة توزيع القيم على الفئات
اختر عددًا صحيحًا من الفئات بين 1 و256، أو اترك الحقل لتُستخدم 16 فئة تلقائيًا. يُقسّم نطاق الشدة الكامل ذي 8 بت إلى فترات متساوية العرض تبدأ من 0 وتنتهي عند 255. عند اختيار 16 فئة، تعدّ الأولى القيم من 0 إلى 15، والثانية من 16 إلى 31، والأخيرة من 240 إلى 255. وبصورة عامة، يساوي رقم الفئة الجزء الصحيح الأدنى من قيمة البكسل مضروبة في عدد الفئات ومقسومة على 256. تُحفظ النهاية العليا صراحة في الفئة الأخيرة، لذلك لا تضيع القيمة 255 خارج المصفوفة. يبقى هذا التعريف حتميًا حتى عندما لا يقسم عدد الفئات المختار العدد 256 بالتساوي. يزيد كل بكسل عدادًا واحدًا فقط، ولذلك يساوي مجموع العدادات في القناة قيمة pixel_count الخاصة بها.
اقرأ النتيجة وقارنها وتحقق منها
تعرض الاستجابة العدد المختار في bins، والحدين الثابتين value_min وvalue_max، وكائن مدرج تكراري لكل قناة إدخال. يحتفظ كل كائن باسم القناة، ويعرض pixel_count، ويعيد counts مرتبة تصاعديًا حسب الشدة. يمثل الموضع الأول دائمًا الفترة الأشد ظلمة والأخير الفترة الأشد سطوعًا، مما يسهّل رسم المصفوفات أو مقارنتها. اجمع عناصر counts وتأكد من أن الناتج يساوي pixel_count؛ تضمن الخوارزمية هذه الخاصية، وقد يكشف التحقق فقدان بيانات في مرحلة أخرى من مسار العمل. يلخص المدرج التكراري التردد ولا يحفظ الترتيب المكاني، لذلك قد تكون لصورتين مختلفتين بصريًا النتيجة نفسها. كما أن الأداة لا تفك ترميز الملفات، ولا تستنتج فضاء الألوان، ولا تضبط التعريض، ولا تدمج القنوات. فك ترميز المصدر أولًا ثم استخدم هذه القدرة لمرحلة العد. تبقى البيانات محلية في المتصفح، وتبلغ كلفة أتمتة API مقدار $0.002 لكل طلب.
حالات الاستخدام
مقارنة توزيعات قنوات الألوان
أنشئ أعدادًا بالفئات نفسها للأحمر والأخضر والأزرق قبل قياس الاختلاف بين صورتين فُك ترميزهما.
اكتشاف أطراف التعريض
افحص الفئتين الأولى والأخيرة لتحديد القنوات التي تهيمن عليها الظلال أو المناطق الساطعة.
التحقق من مسار معالجة الصور
سجّل مدرجات تكرارية حتمية قبل التحويل وبعده لاكتشاف تغيرات لونية غير متوقعة.
الأسئلة الشائعة
ما تكلفة الاستخدام؟
تبلغ كلفة التنفيذ عبر API مقدار $0.002 لكل طلب. ويمكن إجراء الحساب الحتمي نفسه في المتصفح أيضًا.
ما قيم البكسل المقبولة؟
يجب أن تكون كل قيمة عددًا صحيحًا من 0 إلى 255، بما يوافق قناة صورة ذات 8 بت.
ماذا يحدث إذا كانت قائمة البكسلات فارغة؟
يفشل الطلب برسالة إدخال غير صالح، ولا تنتج القائمة الفارغة مدرجًا تكراريًا مملوءًا بالأصفار.
كيف توزّع القيم إذا لم يقسم عدد الفئات 256؟
يُحسب الرقم بأخذ الجزء الصحيح الأدنى من value مضروبة في bins ومقسومة على 256، مع إبقاء 255 في الفئة الأخيرة.
هل تفك الأداة ترميز ملفات PNG أو JPEG أو WebP؟
لا. يجب تقديم قيم بكسل فُك ترميزها مسبقًا ونُظمت في مصفوفات قنوات مسماة.
هل يمكن أن تختلف أعداد البكسلات بين القنوات؟
نعم. تُعد كل قناة بصورة مستقلة وتعرض قيمة pixel_count الخاصة بها.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر 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"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_channels | 16 |
max_values_per_channel | 1000000 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |