Pamfunc User Manual(0) Pamfunc User Manual(0)

pamfunc - اعمال یک تابع حسابی یکانی ساده روی یک تصویر Netpbm

pamfunc { -multiplier=realnum | -divisor=realnum | -adder=integer | -subtractor=integer | -min=wholenum | -max=wholenum -andmask=hexmask -ormask=hexmask -xormask=hexmask -not -shiftleft=count -shiftright=count [-changemaxval] } [filespec]

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

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

برنامه pamfunc یک تصویر Netpbm را به عنوان ورودی می‌خواند و یک تصویر Netpbm با همان قالب و ابعاد ورودی به عنوان خروجی تولید می‌کند. pamfunc یک تابع انتقال ساده را روی هر نمونه در ورودی اعمال می‌کند تا نمونهٔ متناظر آن را در خروجی ایجاد نماید. گزینه‌ها تعیین‌کنندهٔ این تابع هستند.

نمونه‌های دخیل در این پردازش نمونه‌های PAM هستند. اگر ورودی PBM، PGM یا PPM باشد، خروجی نیز در همان قالب خواهد بود، اما pamfunc توابع را روی نمونه‌های معادل PAM اعمال کرده و نمونه‌های معادل PAM تولید می‌کند. این موضوع می‌تواند در حالت PBM دور از ذهن و غیربدیهی به نظر برسد.

برنامهٔ pamarith همین کار را برای توابع دوگانی (باینری) انجام می‌دهد -- دو تصویر را به عنوان ورودی می‌گیرد و یک تابع حسابی ساده و مشخص (مانند جمع) را روی جفت‌های نمونه از دو تصویر اعمال می‌کند تا یک تصویر خروجی واحد تولید نماید.

توابع به دو دسته تقسیم می‌شوند: حسابی (مانند ضرب در ۵) و رشتهٔ بیتی (مانند AND با 01001000). برای توابع حسابی، آرگومان‌ها و نتایج تابع، کسری هستند که یک نمونه از maxval تشکیل می‌دهد، یعنی همان تفسیر معمول چندتایی‌های PAM. اما برای توابع رشتهٔ بیتی، مقدار همان رشتهٔ بیتی است که مقدار آن در قالب یک رمز دودویی برابر با مقدار نمونه است، و maxval پهنای رشتهٔ بیتی (تعداد بیت‌ها) را مشخص می‌کند.

توابع حسابی (Arithmetic functions)

توابع حسابی مواردی هستند که توسط گزینه‌های -multiplier، -divisor، -adder، -subtractor، -min و -max انتخاب می‌شوند.

به عنوان مثال، تصویری را با maxval برابر با ۱۰۰، مقدار نمونهٔ ۱۰ و تابعی تحت عنوان «ضرب در ۵» در نظر بگیرید. آرگومان ورودی تابع 10/100 (یعنی 0.1) و نتیجهٔ آن 5 * 0.1 = 0.5 است. در ساده‌ترین حالت، maxval خروجی نیز ۱۰۰ است، بنابراین مقدار نمونه خروجی 0.5 * 100 = 50 خواهد بود. همان‌طور که می‌بینید، می‌توانستیم به جای این کسرها صرفاً دربارهٔ خود مقادیر نمونه صحبت کنیم و به همان نتیجه برسیم (10 * 5 = 50)، اما این کار را نمی‌کنیم.

جایی که تفاوت عملی ایجاد می‌شود که آیا مقادیر را کسر از maxval در نظر بگیریم یا صرفاً خود مقدار نمونه، جایی است که pamfunc مقدار maxval متفاوتی در تصویر خروجی نسبت به آنچه در تصویر ورودی می‌یابد به کار می‌برد. گزینهٔ -changemaxval را ببینید.

بنابراین هنگام خواندن توضیحات زیر به یاد داشته باشید که در این مثال، مقادیر 0.1 و 0.5 هستند، نه ۱۰ و ۵۰. تمام آرگومان‌ها و نتایج در بازهٔ [0,1] قرار دارند.

توابع رشتهٔ بیتی (Bit string functions)

توابع رشتهٔ بیتی مواردی هستند که با گزینه‌های -andmask، -ormask، -xormask، -not، -shiftleft و -shiftright انتخاب می‌شوند.

در این توابع، maxval معنایی کاملاً متفاوت با تصاویر معمولی Netpbm دارد: این مقدار مشخص می‌کند رشتهٔ بیتی چقدر پهن است (شامل چند بیت است). مقدار maxval باید یک شمارش دودویی کامل (توانی از دو منهای یک، مانند 0xff) باشد و تعداد بیت‌های یک در آن، پهنای رشتهٔ بیتی را نشان می‌دهد.

به عنوان مثال، تصویری با maxval برابر با ۱۵، مقدار نمونهٔ ۵ و تابعی با عنوان «AND با 0100» را در نظر بگیرید. آرگومان تابع 0101 و نتیجه 0100 است.

در این مثال، تا زمانی که پهنای رشته حداقل ۳ باشد، تفاوتی در عمل ایجاد نمی‌کند که پهنای رشته را چه در نظر بگیریم. اگر maxval برابر با ۲۵۵ بود، نتیجه یکسان می‌بود. اما در یک عملیات شیفت بیتی، این موضوع اهمیت دارد. شیفت دادن به چپ به اندازهٔ ۲ بیت را در نظر بگیرید. در این مثال، جایی که مقدار ورودی 0101 است، نتیجه 0100 خواهد بود. اما اگر maxval برابر ۲۵۵ بود، نتیجه 00010100 می‌شد.

برای یک تابع ماسک‌گذاری (masking)، مقدار ماسکی که تعیین می‌کنید نباید بیت‌های پرارزش‌تری نسبت به پهنای مشخص‌شده توسط maxval داشته باشد.

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

رفتار نامتعارف PBM (PBM Oddness)

اگر با قالب PBM آشنایی داشته باشید، ممکن است عملکرد pamfunc روی تصاویر PBM از نظرتان غیربدیهی و خلاف انتظار به نظر برسد. از آنجا که در PBM رنگ سیاه با ۱ و رنگ سفید با ۰ نشان داده می‌شود (نرمال‌شده به ۱.۰ و ۰.۰)، ممکن است انتظار داشته باشید افزودن ۱ به سفید منجر به سیاه شود.

اما قالب PBM در اینجا نامربوط است، زیرا pamfunc روی اعدادی کار می‌کند که در معادل PAM یافت می‌شوند (بالا را ببینید). در یک تصویر سیاه و سفید PAM، سیاه ۰ و سفید ۱ است (نرمال‌شده به ۰.۰ و ۱.۰). بنابراین سفید به علاوهٔ ۱ (که به مقدار بیشینهٔ ۱.۰ برش می‌خورد/کلیپ می‌شود) همچنان سفید باقی می‌ماند.

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

این گزینه تابع انتقال را به ضرب در realnum تبدیل می‌کند. realnum باید نامنفی باشد. اگر نتیجه بزرگ‌تر از یک شود، به یک برش می‌خورد (clip می‌شود).

در صورتی که ورودی تصویری از نوع PGM یا PPM باشد، این کار اثر تیره کردن یا روشن کردن آن را دارد. برای نوع متفاوتی از روشن‌سازی، به pambrighten(1) و ppmflash(1) مراجعه کنید.

همچنین، به ppmdim(1) مراجعه کنید، که همان کار pamfunc -multiplier را روی یک تصویر PPM با ضریبی بین صفر و یک انجام می‌دهد، با این تفاوت که از محاسبات عدد صحیح استفاده می‌کند، بنابراین ممکن است سریع‌تر باشد.

و ppmfade(1) می‌تواند یک توالی کامل از تصاویر تولید کند که روشنایی آن‌ها رو به سیاه کاهش یافته یا رو به سفید افزایش می‌یابد، چنانچه به آن نیاز داشته باشید.

این گزینه تابع انتقال را به تقسیم بر realnum تبدیل می‌کند. realnum باید نامنفی باشد. اگر نتیجه بزرگ‌تر از یک شود، به یک برش می‌خورد (clip می‌شود).

این همان تابعی است که با -multiplier با تعیین معکوس ضربی realnum به دست می‌آورید.

این گزینه تابع انتقال را به جمع با integer/maxval تبدیل می‌کند. اگر نتیجه بزرگ‌تر از یک شود، به یک برش می‌خورد. اگر کمتر از صفر شود، به صفر برش می‌خورد.

توجه داشته باشید که در ریاضیات، این موجودیت "addend" (مَفروقٌ‌مِنه یا افزوده) نامیده می‌شود و در انگلیسی "adder" یک مار است. ما از "adder" استفاده می‌کنیم زیرا مفهوم‌تر است.

این گزینه تابع انتقال را به تفریق integer/maxval تبدیل می‌کند. اگر نتیجه بزرگ‌تر از یک شود، به یک برش می‌خورد. اگر کمتر از صفر شود، به صفر برش می‌خورد.

توجه داشته باشید که در ریاضیات، این موجودیت را "subtrahend" (مَفروق یا کاسته) می‌نامند نه "subtractor". ما از "subtractor" استفاده می‌کنیم زیرا مفهوم‌تر است.

این همان تابعی است که با -adder با تعیین منفیِ integer به دست می‌آورید.

این گزینه تابع انتقال را به محاسبهٔ بیشینهٔ (ماکزیممِ) آرگومان و wholenum/maxval تبدیل می‌کند؛ یعنی کمترین مقدار در خروجی wholenum/maxval خواهد بود.

اگر wholenum/maxval بزرگ‌تر از یک باشد، تمام مقادیر در خروجی یک خواهند بود.

این گزینه تابع انتقال را به محاسبهٔ کمینهٔ (مینیممِ) آرگومان و wholenum/maxval تبدیل می‌کند؛ یعنی بیشترین مقدار در خروجی wholenum/maxval خواهد بود.

اگر wholenum/maxval بزرگ‌تر از یک باشد، تابع همانی (idempotent) خواهد بود -- خروجی دقیقاً مشابه ورودی است.

این گزینه تابع انتقال را به AND بیتی با hexmask تبدیل می‌کند.

hexmask در مبنای شانزده (هگزادسیمال) است. مثال: 0f

این گزینه در Netpbm نسخهٔ 10.40 (سپتامبر 2007) جدید بود.

این گزینه تابع انتقال را به OR فراگیر بیتی با hexmask تبدیل می‌کند.

این گزینه مشابه -andmask است.

این گزینه در Netpbm نسخهٔ 10.40 (سپتامبر 2007) جدید بود.

این گزینه تابع انتقال را به XOR انحصاری بیتی با hexmask تبدیل می‌کند.

این گزینه مشابه -andmask است.

این گزینه در Netpbm نسخهٔ 10.40 (سپتامبر 2007) جدید بود.

این گزینه تابع انتقال را به وارون‌سازی منطقی بیتی (مثلاً مقدار نمونهٔ 0xAA به 0x55 تبدیل می‌شود) تبدیل می‌کند.

برنامهٔ pnminvert همین کار را برای یک تصویر دیداری دوسطحی که دارای maxval برابر با ۱ است یا از نوع PBM می‌باشد انجام می‌دهد.

این گزینه در Netpbm نسخهٔ 10.40 (سپتامبر 2007) جدید بود.

این گزینه تابع انتقال را به شیفت بیتی به چپ به تعداد count بیت تبدیل می‌کند.

این گزینه در Netpbm نسخهٔ 10.40 (سپتامبر 2007) جدید بود.

این گزینه تابع انتقال را به شیفت بیتی به راست به تعداد count بیت تبدیل می‌کند.

این گزینه مشابه -shiftleft است.

این گزینه در Netpbm نسخهٔ 10.40 (سپتامبر 2007) جدید بود.

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

اما یک حالت وجود دارد که در آن pamfunc می‌تواند صرفاً با تغییر maxval و دست‌نخورده گذاشتن مقادیر نمونه به همان نتیجه برسد: تقسیم بر عددی بزرگ‌تر یا مساوی ۱، یا ضرب در عددی کوچک‌تر یا مساوی ۱. به عنوان مثال، برای نصف کردن همهٔ مقادیر، pamfunc می‌تواند صرفاً maxval را دو برابر کند.

با گزینهٔ -changemaxval، برنامهٔ pamfunc دقیقاً همین کار را انجام خواهد داد.

از آنجا که قالب‌های Netpbm دارای حداکثر maxval برابر با ۶۵۵۳۵ هستند، برای مقسوم‌علیه‌های بزرگ، pamfunc ممکن است نتواند از این روش استفاده کند.

یک مزیت تقسیم از طریق تغییر maxval این است که دقت را از دست نمی‌دهید. مقدار maxval بالاتر به معنای دقت بالاتر است. به عنوان مثال، تصویری با maxval برابر با ۱۰۰ و مقدار نمونهٔ ۱۰ را در نظر بگیرید. شما آن را بر ۲۱ تقسیم کرده و سپس دوباره در ۲۱ ضرب می‌کنید. اگر pamfunc این کار را با تغییر مقادیر نمونه در حین حفظ maxval روی ۱۰۰ انجام دهد، تقسیم به مقدار نمونهٔ ۰ و ضرب نیز به صفر خواهد انجامید. اما اگر pamfunc در عوض مقدار نمونهٔ ۱۰ را حفظ کند و maxval را تغییر دهد، تقسیم منجر به maxval برابر با ۲۱۰۰ شده و ضرب آن را دوباره به ۱۰۰ بازمی‌گرداند، و این رفت‌وبرگشت بدون افت دقت (همانی) خواهد بود.

این گزینه در Netpbm نسخهٔ 10.65 (دسامبر 2013) جدید بود.

ppmdim(1)، pambrighten(1)، pamdepth(1)، pamarith(1)، pamsummcol(1)، pamsumm(1)، ppmfade(1)، pnminvert(1)، pam(1)، pnm(1)

این برنامه در نسخهٔ 10.3 (ژوئن 2002) به Netpbm افزوده شد.

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

http://netpbm.sourceforge.net/doc/pamfunc.html
09 September 2020 netpbm documentation