Pnmcolormap User Manual(0) Pnmcolormap User Manual(0)

pnmcolormap - ایجاد نقشه‌رنگ کوانتیزاسیون برای یک تصویر Netpbm

pnmcolormap

[-center|-meancolor|-meanpixel]

[-spreadbrightness|-spreadluminosity]

[-splitpixelct|-splitcolorct|-splitspread]

[-sort]

[-square]

[-verbose]

[-debug]

ncolors|all

[pnmfile]

این برنامه بخشی از Netpbm(1) است.

برنامه pnmcolormap یک تصویر PNM یا PAM را به عنوان ورودی خوانده، تعداد ncolors رنگ را برای بهترین بازنمایی تصویر انتخاب می‌کند و یک نقشه‌رنگ (colormap) PNM حاوی تعریف آن‌ها در خروجی می‌نویسد. یک تصویر PAM در واقع ممکن است حاوی تاپل‌هایی از هر نوع باشد، اما مفهوم pnmcolormap از مقادیر تاپل‌هایی که به بهترین شکل عناصر موجود در تصویر را نمایش دهند، در صورتی که نوع تاپل RGB یا GRAYSCALE نباشد ممکن است چندان منطقی نباشد. طراحی این برنامه و باقی این راهنما، فرض را بر این می‌گذارد که تاپل‌ها بیانگر رنگ‌ها هستند.

می‌توانید از این نقشه‌رنگ به عنوان ورودی برای pnmremap بر روی همان تصویر ورودی استفاده کنید تا رنگ‌های آن تصویر را کوانتیزه کنید (یعنی تصویری مشابه با تعداد رنگ‌های کمتر تولید کنید). برنامه pnmquant هر دو مرحله pnmcolormap و pnmremap را برای شما انجام می‌دهد.

یک نقشه‌رنگ PNM در واقع تصویری در فرمت PNM با هر ابعادی است که حداقل یک پیکسل از هر رنگ در مجموعه رنگ‌هایی که بازنمایی می‌کند دارد. نقشه‌هایی که pnmcolormap تولید می‌کند دقیقاً شامل یک پیکسل از هر رنگ هستند، به جز در مواردی که با استفاده از گزینه -square پدینگ (padding) ضروری باشد.

روش کوانتیزاسیون مورد استفاده، روش "median cut" هکبرت (Heckbert) است. مشاهده کنید: روش کوانتیزاسیون .

تصویر خروجی دارای همان فرمت (PBM، PGM، PPM، PAM) تصویر ورودی است. توجه داشته باشید که نقشه‌رنگ یک تصویر PBM چندان جذاب و کاربردی نیست.

نقشه‌رنگ معمولاً همان مقدار maxval تصویر ورودی را دارد، اما pnmcolormap ممکن است در صورت وجود رنگ‌های بیش از حد در ورودی، به عنوان بخشی از الگوریتم کوانتیزاسیون خود آن را کاهش دهد.

برنامه pnmcolormap بر روی یک جریان ورودی چندتصویری (multi-image) نیز کار می‌کند. در آن صورت، یک نقشه‌رنگ تولید می‌کند که برای تمام رنگ‌های موجود در تمامی تصاویر ورودی اعمال می‌شود. همه تصاویر باید فرمت، عمق و maxval یکسانی داشته باشند (اما می‌توانند عرض و ارتفاع متفاوتی داشته باشند). این قابلیت زمانی مفید است که بخواهید مجموعه‌ای از تصاویر را کوانتیزه کنید که یک ویدیو تشکیل می‌دهند یا به نوعی با هم استفاده می‌شوند؛ معمولاً می‌خواهید همگی از یک پالت مشترک استفاده کنند، در حالی که محاسبه جداگانه نقشه‌رنگ برای هر تصویر موجب می‌شود رنگ‌های یکسان در دو تصویر به رنگ‌های متفاوتی نگاشت شوند. پیش از Netpbm 10.31 (دسامبر ۲۰۰۵)، pnmcolormap تصاویر پس از تصویر اول را نادیده می‌گرفت.

اگر می‌خواهید نقشه‌رنگی را بدون تکیه بر رنگ‌های یک تصویر ورودی ایجاد کنید، ابزارهای pamseq، ppmmake و pamcat می‌توانند مفید باشند.

تنها پارامتری که اجباری است، تعداد رنگ‌هایی است که در نقشه‌رنگ خروجی می‌خواهید. برنامه pnmcolormap ممکن است نقشه‌رنگی با تعداد رنگ‌هایی اندکی کمتر از آن تولید کند. می‌توانید all را مشخص کنید تا نقشه‌رنگی از تمام رنگ‌های موجود در تصویر ورودی (بدون کوانتیزاسیون) دریافت نمایید. هنگامی که all را تعیین می‌کنید، عملکرد برنامه اساساً مشابه عملکرد ppmhist -map است. برنامه ppmhist بسیار قدیمی‌تر است.

علاوه بر گزینه‌های مشترک بین تمامی برنامه‌های مبتنی بر libnetpbm (به‌ویژه -quiet؛ مشاهده کنید: گزینه‌های عمومی )، برنامه pnmcolormap گزینه‌های خط فرمان زیر را تشخیص می‌دهد:

تمامی گزینه‌ها را می‌توان به کوتاه‌ترین پیشوند منحصربه‌فردشان خلاصه کرد. می‌توانید به جای یک خط تیره از دو خط تیره برای تعیین گزینه استفاده کنید. همچنین می‌توانید میان نام گزینه و مقدار آن از فاصله یا علامت مساوی استفاده نمایید.

این گزینه باعث می‌شود نقشه‌رنگ خروجی بر اساس شدت مؤلفه قرمز، سپس سبز و سپس آبی به صورت صعودی مرتب شود. این مرتب‌سازی از نوع مرتب‌سازی درجی (insertion sort) است، بنابراین در نقشه‌رنگ‌های بزرگ خیلی سریع نیست. مرتب‌سازی مفید است زیرا امکان مقایسه دو مجموعه رنگ را به شما می‌دهد.
به‌طور پیش‌فرض، pnmcolormap نقشه‌رنگ را به صورت یک تصویر PPM با یک سطر و با یک ستون به ازای هر رنگ در نقشه‌رنگ تولید می‌کند. این گزینه باعث می‌شود که pnmcolormap به جای آن یک تصویر PPM تولید کند که اختلاف ابعاد آن تا مربع کامل در حد یک سطر یا ستون باشد، و در صورت نیاز آخرین پیکسل تکرار می‌شود تا تعداد پیکسل‌ها یک مربع تقریباً کامل ایجاد کند.
این گزینه باعث می‌شود pnmcolormap پیام‌هایی درباره کوانتیزاسیون به خروجی خطای استاندارد ارسال کند.
این گزینه باعث می‌شود pnmcolormap پیام‌هایی درباره عملکردهای داخلی به خروجی خطای استاندارد ارسال کند.
این گزینه‌ها الگوریتم کوانتیزاسیون را کنترل می‌کنند. مشاهده کنید: روش کوانتیزاسیون .

روش کوانتیزاسیون راهکاری است برای انتخاب رنگ‌هایی که (با تعداد کمتر از ورودی) در خروجی می‌خواهید. برنامه pnmcolormap از روش کوانتیزاسیون "median cut" متعلق به Heckbert استفاده می‌کند.

این روش شامل تفکیک تمامی رنگ‌ها درون "جعبه‌ها" (boxes) است، که هر جعبه رنگ‌هایی را در بر می‌گیرد که تقریباً تعداد پیکسل‌های یکسانی را نمایندگی می‌کنند. کار با یک جعبه آغاز می‌شود و جعبه‌ها به دو نیم تقسیم می‌شوند تا جایی که تعداد جعبه‌ها با تعداد رنگ‌های مد نظر شما در خروجی برابر شود، و سپس یک رنگ برای نمایندگی هر جعبه انتخاب می‌گردد.

سه روش وجود دارد که pnmcolormap می‌تواند به وسیله آن‌ها جعبه را برای تقسیم در هر مرحله انتخاب کند:

  • تقسیم جعبه‌ای که بیشترین پیکسل را دارد. این حالت پیش‌فرض است، و می‌توانید آن را صراحتاً با گزینه -splitpixelct انتخاب کنید.
  • تقسیم جعبه‌ای که بیشترین رنگ را دارد. این مورد تنها برای اهداف پژوهشی و آکادمیک مفید به نظر می‌رسد. این گزینه را با -splitcolorct انتخاب کنید.
  • تقسیم جعبه‌ای که بزرگ‌ترین گستره رنگی (color spread) را دارد. این حالت را با گزینه -splitspread انتخاب کنید. این روش می‌تواند نتیجه بهتری برای جزئیات کوچک با رنگ‌هایی که در جاهای دیگر تصویر یافت نمی‌شوند تولید کند.

گزینه‌های -splitpixelct، splitcolorct و splitspread در Netpbm 10.88 (سپتامبر ۲۰۱۹) جدید بودند. پیش از آن، pnmcolormap همیشه جعبه حاوی بیشترین پیکسل را تقسیم می‌کرد.

هنگامی که یک جعبه را تقسیم می‌کنید، این کار به گونه‌ای انجام می‌شود که هر زیرجعبه تعداد پیکسل یکسانی داشته باشد (به جز اینکه اگر کل جعبه تعداد فردی داشته باشد، یک زیرجعبه یکی بیشتر خواهد داشت)، با قرارگیری پیکسل‌های «بزرگ‌تر» در یک زیرجعبه و پیکسل‌های «کوچک‌تر» در زیرجعبه دیگر. «بزرگ‌تر» برای یک جعبه خاص، به معنای روشن‌تر بودن در مؤلفه رنگی (قرمز، سبز، آبی) است که بیشترین گستره را در آن جعبه دارد. برنامه pnmcolormap دو راه برای تعریف "بزرگ‌ترین گستره" به شما ارائه می‌دهد: ۱) بزرگ‌ترین گستره روشنایی؛ ۲) بزرگ‌ترین گستره سهم در درخشندگی (luminosity) رنگ؛ برای مثال رنگ قرمز بسیار بیشتر از آبی وزن‌دهی می‌شود. انتخاب میان این دو با گزینه‌های -spreadbrightness و -spreadluminosity صورت می‌گیرد. حالت پیش‌فرض -spreadbrightness است. در جاهایی که چندین رنگ با اندازه میانه وجود داشته باشند، آن‌ها به صورت دلخواه میان زیرجعبه‌ها توزیع می‌شوند.

با این حال، این توزیع دلخواه برای یک نسخه مشخص از Netpbm تکرارپذیر است؛ هر بار فراخوانی pnmcolormap همان نقشه‌رنگ را تولید می‌کند. پیش از Netpbm 11.03 (ژوئن ۲۰۲۳)، توزیع به عملکرد تابع qsort سیستم در مواجهه با مقادیر مساوی متعدد بستگی داشت، بنابراین pnmcolormap ممکن بود روی سیستم‌های مختلف نتایج اندکی متفاوت تولید کند.

برنامه pnmcolormap سه روش برای انتخاب رنگ نماینده یک جعبه ارائه می‌دهد: ۱) رنگ مرکزی - رنگی که در میانه راه میان بزرگ‌ترین و کوچک‌ترین رنگ‌های جعبه قرار دارد (با استفاده از تعریف بالا برای «بزرگ‌تر»)؛ ۲) میانگین رنگ‌ها در جعبه (هر مؤلفه بر اساس روشنایی جداگانه میانگین‌گیری می‌شود)؛ ۳) میانگین وزنی بر اساس تعداد پیکسل‌های هر رنگ در تصویر.

انتخاب میان این موارد با گزینه‌های -center، -meancolor و -meanpixel انجام می‌شود. حالت پیش‌فرض -center است.

توجه داشته باشید که در هر سه روش، ممکن است رنگ‌هایی در خروجی وجود داشته باشند که اصلاً در ورودی وجود نداشته‌اند.

همچنین توجه داشته باشید که رنگی که برای نمایندگی رنگ‌های جعبه A به عنوان بهترین انتخاب شده است، ممکن است یک رنگ در جعبه B را نیز بهتر از رنگ انتخاب‌شده برای جعبه B نمایندگی کند. این امر برای معیارهای مختلف سنجش مناسب بودن بازنمایی یک رنگ توسط رنگی دیگر صادق است. به‌ویژه، اگر از pnmremap برای نگاشت رنگ‌های همان تصویری که برای ایجاد نقشه‌رنگ استفاده کردید به رنگ‌های آن نقشه‌رنگ استفاده کنید، رنگ‌های جعبه B اغلب به رنگی نگاشت می‌شوند که pnmcolormap برای نمایندگی جعبه دیگری انتخاب کرده است و در واقع رنگی که pnmcolormap برای نمایندگی جعبه B انتخاب کرده ممکن است اصلاً در خروجی pnmremap ظاهر نشود.

"Color Image Quantization for Frame Buffer Display" نوشته Paul Heckbert، مجموعه مقالات SIGGRAPH '82، صفحه ۲۹۷.

pnmremap(1), pnmquant(1), ppmquantall(1), pamgetcolor(1), pamdepth(1), ppmdither(1), pamseq(1), ppmmake(1), pamcat(1), ppm(1)

پیش از Netpbm 10.15 (آوریل ۲۰۰۳)، pnmcolormap برای تصاویر بزرگ حافظه بسیار بیشتری مصرف می‌کرد زیرا کل تصویر ورودی را در حافظه نگه می‌داشت. اکنون، آن را سطر به سطر پردازش می‌کند، اما چون گاهی باید چندین گذر روی تصویر انجام دهد، اگر ورودی قبلاً در یک فایل با قابلیت جستجو (seekable) نباشد، ابتدا ورودی را در یک فایل موقت قابل جستجو کپی می‌کند.

برنامه pnmcolormap نخستین بار در Netpbm 9.23 (ژانویه ۲۰۰۲) ظاهر شد. پیش از آن، عملکرد آن تنها به عنوان بخشی از قابلیت pnmquant (که برگرفته از برنامه بسیار قدیمی‌تر ppmquant بود) در دسترس بود. کوانتیزاسیون رنگ در واقع دو زیرکارکرد اصلی دارد، بنابراین Netpbm 9.23 آن را به دو برنامه جداگانه تقسیم کرد: pnmcolormap و pnmremap، و سپس Netpbm 9.24 برنامه pnmquant را با برنامه‌ای جایگزین کرد که صرفاً pnmcolormap و pnmremap را فراخوانی می‌کند.

حق نشر © ۱۹۸۹، ۱۹۹۱ متعلق به Jef Poskanzer است.

این صفحه راهنما توسط ابزار Netpbm با نام 'makeman' از منبع HTML تولید شده است. مستندات اصلی در آدرس زیر قرار دارد:

http://netpbm.sourceforge.net/doc/pnmcolormap.html
21 February 2023 netpbm documentation