Pnmremap User Manual(0) Pnmremap User Manual(0)

pnmremap - جایگزینی رنگ‌ها در یک تصویر PNM با رنگ‌هایی از یک مجموعه دیگر

pnmremap

-mapfile=palettefile

[-floyd|-fs|-nfloyd|-nofs]

{[-norandom]|randomseed=n}

[-firstisdefault]

[-verbose]

[-missingcolor=colorspec]

[pnmfile]

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

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

دستور pnmremap رنگ‌های یک تصویر ورودی را با رنگ‌های موجود در پالت مشخص‌شده جایگزین می‌کند. رنگ‌هایی از ورودی که در پالت وجود دارند، در خروجی بدون تغییر باقی می‌مانند. اما در صورتی که ورودی حاوی رنگی باشد که در پالت موجود نیست، pnmremap گزینه‌های زیر را در اختیارتان قرار می‌دهد:

  • انتخاب نزدیک‌ترین رنگ از پالت.
  • انتخاب اولین رنگ از پالت.
  • استفاده از رنگی که با گزینه خط فرمان (-missing) مشخص شده است.
  • دیترینگ (Dither). این بدان معناست که pnmremap به‌جای نگاشت پیکسل به پیکسل، از رنگ‌های پالت استفاده می‌کند تا نواحی چندپیکسلی در خروجی دارای همان رنگ میانگین ورودی باشند (برای نوع دیگری از دیترینگ، به ppmdither مراجعه کنید).

دو دلیل اصلی برای استفاده از این برنامه وجود دارد: ۱) می‌خواهید تعداد رنگ‌ها را در تصویر ورودی کاهش دهید؛ و ۲) باید تصویر را به برنامه‌ای تحویل دهید که فقط توانایی مدیریت رنگ‌های خاصی را دارد.

برای کاهش رنگ‌ها، می‌توانید پالت را با استفاده از pnmcolormap تولید کنید.

به‌طور پیش‌فرض، pnmremap رنگی از ورودی را که در پالت نیست، به نزدیک‌ترین رنگ موجود در پالت نگاشت می‌کند. «نزدیک‌ترین» به معنای کمترین فاصله دکارتی در فضای روشنایی قرمز، سبز و آبی است (کمترین مجموع مربعات تفاوت‌ها در شدت‌های تنظیم‌شده بر اساس گامای ITU-R Recommendation BT.709 برای قرمز، سبز و آبی).

در عوض می‌توانید یک رنگ پیش‌فرض تکی را مشخص کنید تا pnmremap برای هر رنگی در تصویر ورودی که در پالت وجود ندارد از آن استفاده کند. برای این کار از گزینه -missing استفاده کنید.

همچنین می‌توانید تعیین کنید که اولین رنگ در تصویر پالت، رنگ پیش‌فرض باشد. برای این منظور از گزینه -firstisdefault استفاده نمایید.

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

اگر گزینه -missing را تعیین کنید، رنگ مشخص‌شده علاوه بر رنگ‌های موجود در تصویر پالت، به عنوان عضوی از پالت در نظر گرفته می‌شود.

به دلایل تاریخی، گاهی در Netpbm پالت را یک «نقشه رنگ» (colormap) می‌نامند؛ اما در واقعیت چیزی را نگاشت نمی‌کند. دستور pnmremap بر اساس پالت، نقشه اختصاصی خود را می‌سازد تا رنگ‌ها را از تصویر ورودی به رنگ‌های خروجی نگاشت نماید.

در حالت ساده، تصویر پالت دارای همان عمق (تعداد صفحه‌ها یا مؤلفه‌ها در هر تاپل/پیکسل) تصویر ورودی است و pnmremap صرفاً یک جستجوی سرراست در پالت برای هر تاپل (پیکسل) ورودی انجام می‌دهد. در حقیقت، برای pnmremap حتی تفاوتی ندارد که تصویر یک تصویر بصری باشد یا خیر.

اما اگر عمق‌ها متفاوت باشند چه اتفاقی می‌افتد؟ در این حالت، pnmremap تصویر ورودی را (در حافظه خود) به نوع مطابق با پالت تبدیل کرده و سپس مطابق قبل عمل می‌کند.

تنها دو حالت از این تبدیل‌ها وجود دارد که pnmremap نحوه انجام آن‌ها را می‌داند: حالتی که یکی از آن‌ها دارای نوع تاپل RGB و عمق ۳ باشد و دیگری دارای نوع تاپل GRAYSCALE یا BLACKANDWHITE با عمق ۱ باشد، و برعکس.

در هر حالت دیگری، pnmremap پیام خطایی صادر کرده و با شکست مواجه می‌شود.

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

پیش از Netpbm 10.27 (مارس ۲۰۰۵)، برنامه pnmremap توانایی مدیریت حالتی که عمق پالت بیشتر از عمق تصویر ورودی بود را نداشت (در این حالت با پیام خطا مواجه می‌شد). برای حل این محدودیت می‌توانید با استفاده از ppmtoppm عمق تصویر ورودی را افزایش دهید.

در هر صورت، تصویر خروجی دارای همان نوع تاپل و عمق تصویر پالت خواهد بود.

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

پیش از Netpbm 10.30 (اکتبر ۲۰۰۵)، برنامه pnmremap تمام تصاویر پس از تصویر اول را نادیده می‌گرفت.

pnmcolormap testimg.ppm 256 >palette.ppm
pnmremap -map=palette.ppm testimg.ppm >reduced_testimg.ppm

برای محدود کردن رنگ‌ها به یک مجموعه خاص، یک نمونه رایج ساخت تصویری جهت انتشار در وب جهانی است؛ جایی که مرورگرهای مختلف رنگ‌های مختلفی را می‌شناسند. اما تمام مرورگرها باید ۲۱۶ رنگ به اصطلاح «امن وب» (web safe) را بشناسند که اساساً تمام رنگ‌هایی هستند که می‌توانید در یک تصویر PPM با maxval برابر ۵ نمایش دهید. بنابراین می‌توانید چنین کنید:

pamseq 3 5 >websafe.pam
pnmremap -map=websafe.pam testimg.ppm >websafe_testimg.ppm

یک پالت مفید دیگر، مجموعه ۸ رنگ IBM TTL است که می‌توانید آن را با دستور زیر ایجاد کنید:

pamseq 3 1 >ibmttl.pam

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

تصویر خروجی دارای همان نوع و همان maxval تصویر پالت خواهد بود.

یک پارامتر وجود دارد که الزامی است: مشخصات فایل PNM ورودی.

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

نام فایلی که حاوی تصویر پالت است را مشخص می‌کند.

این گزینه الزامی است.

این گزینه‌ها تعیین می‌کنند که آیا pnmremap دیترینگ فلوید-اشتاینبرگ (Floyd-Steinberg) را انجام دهد یا خیر. بدون فلوید-اشتاینبرگ، pnmremap رنگ خروجی هر پیکسل را فقط بر اساس رنگ پیکسل متناظر در ورودی انتخاب می‌کند. با فلوید-اشتاینبرگ، pnmremap نواحی پیکسلی را به‌گونه‌ای لحاظ می‌کند که میانگین رنگ یک ناحیه در خروجی با ورودی یکسان باشد. اثر دیترینگ از نمای نزدیک به صورت الگویی از نقاط به نظر می‌رسد، اما از دور نقاط با یکدیگر ترکیب می‌شوند به‌طوری که رنگ‌های بیشتری نسبت به رنگ‌های موجود در نقشه رنگ به چشم می‌آیند.

به عنوان مثال، اگر نقشه رنگ شما فقط شامل سیاه و سفید باشد و تصویر ورودی دارای ۴ پیکسل مجاور خاکستری باشد، pnmremap همراه با فلوید-اشتاینبرگ پیکسل‌های خروجی سیاه، سفید، سیاه و سفید تولید می‌کند که از فاصله دور خاکستری دیده می‌شود. اما بدون فلوید-اشتاینبرگ، pnmremap چهار پیکسل سفید تولید می‌کند؛ زیرا سفید تقریب تک‌پیکسلی برای رنگ خاکستری است.

فلوید-اشتاینبرگ نتایج بسیار بهتری را روی تصاویری ارائه می‌دهد که کوانتیزاسیون خام در آن‌ها باعث ایجاد نوارهای رنگی (banding) یا سایر اعوجاج‌ها می‌شود، به‌ویژه در زمان کاهش رنگ به تعداد کم مانند مجموعه رنگ‌های IBM در بالا. با این حال، زمان پردازش پردازنده (CPU) به‌طور قابل توجهی افزایش می‌یابد.

گزینه -fs مترادفی برای -floyd است. گزینه -nofs مترادفی برای -nofloyd است.

حالت پیش‌فرض -nofloyd است.

پیش از Netpbm 10.46 (مارس ۲۰۰۹)، در صورتی که نقشه رنگ مقدار maxval کمتری نسبت به ورودی داشت، دیترینگ دقیقاً آن‌گونه که انتظار می‌رفت کار نمی‌کرد. برنامه pnmremap پیش از انجام دیترینگ، تفکیک‌پذیری رنگ را به مقدار maxval نقشه رنگ کاهش می‌داد؛ بنابراین دیترینگ این اثر را نداشت که تصویر از فاصله دور با maxval اصلی دیده شود. در نسخه‌های فعلی Netpbm، این مشکل برطرف شده است.

این گزینه بر جزئیاتی از فرایند دیترینگ فلوید-اشتاینبرگ تأثیر می‌گذارد. اگر دیترینگ فلوید-اشتاینبرگ انجام ندهید، هیچ تأثیری ندارد.

به‌طور پیش‌فرض، pnmremap انباشتگر انتشار خطا را با مقادیر تصادفی مقداردهی اولیه می‌کند تا از ظاهر شدن الگوهای ناخواسته جلوگیری شود. این یک توسعه بر روی الگوریتم اصلی فلوید-اشتاینبرگ است.

یک عیب این رویکرد آن است که اجرای یکسان pnmremap روی یک ورودی یکسان، هر بار خروجی کمی متفاوتی ایجاد می‌کند که مقایسه خروجی‌ها را دشوار می‌سازد.

با گزینه -norandom، برنامه pnmremap انباشتگرهای خطا را با صفر مقداردهی اولیه می‌کند و خروجی کاملاً قابل پیش‌بینی خواهد بود.

همچنین می‌توانید از -randomseed استفاده کنید تا تصادفی‌سازی روی تصویر اعمال شود، اما نتایج همچنان تکرارپذیر باشند.

نمی‌توانید این گزینه را هم‌زمان با -randomseed مشخص کنید.

گزینه -norandom در Netpbm 10.39 (ژوئن ۲۰۰۷) معرفی شد.

این گزینه بر جزئیاتی از فرایند دیترینگ فلوید-اشتاینبرگ تأثیر می‌گذارد. اگر دیترینگ فلوید-اشتاینبرگ را انجام ندهید، هیچ تأثیری ندارد.

این گزینه بذر (seed) تولیدکننده اعداد تصادفی را تأمین می‌کند که در فرایند تصادفی‌سازی تشریح‌شده در توضیح گزینه -norandom استفاده می‌شود. اگر pnmremap را دو بار با مقدار یکسان -randomseed اجرا کنید، نتایج کاملاً یکسانی دریافت خواهید کرد.

اگر -randomseed را مشخص نکنید، pnmremap بذری را به‌صورت تصادفی انتخاب می‌کند که سطح دیگری از تصادفی بودن را به دیترینگ اضافه می‌نماید.

نمی‌توانید این گزینه را همراه با -norandom مشخص کنید.

این گزینه در Netpbm 10.82 (مارس ۲۰۱۸) اضافه شد.

این گزینه به pnmremap می‌گوید که هر رنگ ورودی را که در پالت وجود ندارد به اولین رنگ موجود در پالت نگاشت کند (رنگ پیکسل در گوشه بالا-چپ تصویر پالت).

به توضیحات (DESCRIPTION) مراجعه کنید.

اگر -firstisdefault را مشخص کنید، مقدار maxval ورودی شما باید با مقدار maxval تصویر پالت مطابقت داشته باشد.

این گزینه رنگ پیش‌فرضی را مشخص می‌کند که pnmremap به رنگ‌هایی در تصویر ورودی اختصاص می‌دهد که در پالت وجود ندارند. color ممکن است در تصویر پالت باشد یا نباشد؛ در هر حال به عنوان بخشی از پالت در نظر گرفته می‌شود.

نحوه بیان colorspec همان‌گونه است که برای آرگومان تابع کتابخانه‌ای pnm_parsecolor() تشریح شده است.

اگر -missingcolor را مشخص کنید، مقدار maxval ورودی باید با مقدار maxval تصویر پالت مطابقت داشته باشد.

نمایش پیام‌های راهنما درباره فرایند نگاشت.

pnmcolormap(1), pamlookup(1), pnmquant(1), ppmquantall(1), pamdepth(1), ppmdither(1), ppmquant(1), pamseq(1), ppm(1)

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

حق نشر ۱۹۸۹، ۱۹۹۱ توسط Jef Poskanzer.

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

http://netpbm.sourceforge.net/doc/pnmremap.html
13 November 2014 netpbm documentation