Pamarith User Manual(0) Pamarith User Manual(0)

pamarith - انجام عملیات حسابی روی دو تصویر Netpbm

pamarith -add | -subtract | -multiply | -divide | -difference | -minimum | -maximum | -mean | -equal | -compare | -and | -or | -nand | -nor | -xor | -shiftleft | -shiftright [-closeness=N] pamfile1 pamfile2 ...

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

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

برنامه pamarith دو یا چند تصویر PBM، PGM، PPM یا PAM را به عنوان ورودی می‌خواند. این دستور عملیات حسابی دودویی (باینری) مشخص‌شده را روی مقادیر نمونه‌های (sample) آن‌ها انجام داده و خروجی را در قالبی تولید می‌کند که نسبت به دو قالب ورودی حالت عمومی‌تری دارد. دو تصویر ورودی باید عرض و ارتفاع یکسانی داشته باشند. محاسبات حسابی روی هر جفت چندتایی (tuple) هم‌مکان انجام می‌شود تا چندتایی هم‌مکان در خروجی تولید گردد.

برای توابعی که خاصیت جابه‌جایی و شرکت‌پذیری دارند، pamarith تابع دودویی را به صورت تکرارشونده بر روی هر تعداد تصویر ورودی که ارائه دهید اعمال می‌کند. برای مثال، برای -add خروجی مجموع همه ورودی‌ها است. برای سایر توابع (مانند -subtract)، در صورتی که بیش از دو تصویر ورودی ارائه دهید، اجرای برنامه ناموفق خواهد بود (پیش از Netpbm نسخه 10.93 (دسامبر ۲۰۲۰)، برنامه همواره با داشتن بیش از دو تصویر ورودی با شکست مواجه می‌شد).

برای برخی دیگر از توابع، pamarith از لحاظ نظری می‌توانست نتیجه معناداری را برای چندین آرگومان محاسبه کند، اما با این وجود اگر بیش از دو تصویر ورودی ارائه دهید با شکست مواجه می‌شود. گزینه‌های -mean و -equal در این دسته‌بندی قرار می‌گیرند.

بیشتر اعمالی که pamarith انجام می‌دهد برای تصاویر دیداری چندان معنادار نیستند. این برنامه در راستای هدف ثانویه Netpbm یعنی صرفاً دستکاری ماتریس‌های دلخواهی از اعداد عمل می‌کند.

جهت انجام محاسبات، برنامه فرض می‌کند که هر تصویر ورودی PBM، PGM یا PPM معادل تصویر PAM با نوع چندتایی (tuple type) به ترتیب BLACKANDWHITE، GRAYSCALE یا RGB است؛ و چنانچه خروجی PBM، PGM یا PPM تولید کند، معادل تصویر PAM که حاصل محاسبه است را ایجاد خواهد کرد.

اولین آرگومان pamfile تصویر آرگومان «سمت چپ» را مشخص می‌کند؛ دومین آرگومان pamfile تصویر «سمت راست» را مشخص می‌سازد.

اگر خروجی PAM باشد، نوع چندتایی آن دقیقاً مشابه نوع چندتایی تصویر ورودی سمت چپ خواهد بود.

برنامه pamarith محاسبات حسابی را روی هر جفت از چندتایی‌های هم‌مکان در دو تصویر ورودی پیاده می‌کند.

عملیات حسابی در تمام موارد اساساً تابعی از دو عدد صحیح به یک عدد صحیح است (اما پایین‌تر را ببینید - توابع به گونه‌ای تعریف شده‌اند که می‌توانید عملاً به عنوان مثال اعداد حقیقی را با هم جمع کنید). عملیات روی دو چندتایی به شرح زیر صورت می‌گیرد: دو تصویر ورودی باید عمق (depth) یکسانی داشته باشند، یا اینکه عمق یکی از آن‌ها باید برابر با یک باشد. اگر هیچ‌یک از این دو حالت برقرار نباشد، اجرای pamarith ناموفق خواهد بود.

اگر هر دو تصویر عمق یکسانی داشته باشند، pamarith به سادگی محاسبات حسابی را روی یک نمونه در هر لحظه انجام می‌دهد؛ یعنی اگر در یک موقعیت مکانی مشخص، تصویر ورودی سمت چپ حاوی چندتایی (s1,s2,...,sN) و تصویر ورودی سمت راست حاوی چندتایی (t1,t2,...tN) باشد و تابع مورد نظر f باشد، آن‌گاه تصویر خروجی حاوی چندتایی (f(s1,t1),f(s2,t2),...,f(sN,tN)) خواهد بود.

اگر یکی از تصاویر دارای عمق ۱ باشد، عملیات حسابی بین تک نمونهٔ موجود در آن تصویر و هر یک از نمونه‌های تصویر دیگر انجام می‌شود؛ یعنی اگر در یک موقعیت مشخص، تصویر ورودی سمت چپ حاوی چندتایی (s) و تصویر ورودی سمت راست حاوی چندتایی (t1,t2,...tN) باشد و تابع f باشد، آن‌گاه تصویر خروجی حاوی چندتایی (f(s,t1),f(s,t2),...,f(s,tN)) خواهد بود.

اگر با قالب PBM آشنایی داشته باشید، ممکن است عملکرد pamarith روی تصاویر PBM از نظرتان دور از ذهن به نظر برسد. از آنجا که در PBM رنگ سیاه با 1 و رنگ سفید با 0 نشان داده می‌شود، ممکن است انتظار داشته باشید «سیاه منهای سیاه» برابر با «سفید» شود.

اما ساختار قالب PBM در اینجا بی‌اثر است، زیرا pamarith روی اعدادی که در معادل PAM یافت می‌شوند کار می‌کند (بالا را ببینید). در یک تصویر سیاه و سفید PAM، رنگ سیاه 0 و رنگ سفید 1 است؛ بنابراین سیاه منهای سیاه برابر با سیاه می‌شود.

مفهوم نمونه‌ها با توجه به مقدار maxval، بسته به تابعی که برمی‌گزینید متغیر است.

به طور کلی در تصاویر PAM، متداول‌ترین معنای یک نمونه (مفهومی که هنگام نمایش یک تصویر دیداری توسط تصویر PAM به کار می‌رود)، این است که کسری از یک مقدار حداکثر را نشان می‌دهد. مقدار maxval تصویر متناظر با یک مقدار حداکثر است (در مورد یک تصویر دیداری، با «شدت کامل» مطابقت دارد) و مقدار نمونه تقسیم بر maxval، این کسر را به دست می‌دهد.

برای pamarith، این تفسیر برای توابع حسابی معمول صدق می‌کند: -add، -subtract، -multiply، -divide، -difference، -minimum، -maximum، -mean، -equal و -compare. برای این موارد، باید آرگومان‌ها و نتیجه را به عنوان اعدادی در بازه [0,1) تصور کنید. به عنوان مثال، اگر maxval تصویر آرگومان سمت چپ ۱۰۰ و maxval تصویر آرگومان سمت راست ۲۰۰ باشد و maxval تصویر خروجی ۲۰۰ تعیین شود، و در یک محاسبه -add مقدار نمونه سمت چپ ۵۰ و مقدار نمونه سمت راست ۶۰ باشد، محاسبه واقعی به صورت 50/100 + 60/200 = 160/200 انجام می‌گیرد و مقدار نمونه خروجی برابر با ۱۶۰ خواهد بود.

برای این توابع، pamarith مقدار maxval تصویر خروجی را برابر با بیشینهٔ دو maxval ورودی قرار می‌دهد، مگر در مورد -equal و -compare. برای -equal، مقدار maxval خروجی همواره ۱ است. برای -compare، این مقدار همواره ۲ است (پیش از Netpbm نسخه 10.14 (فوریه ۲۰۰۳)، هیچ استثنایی برای -compare وجود نداشت؛ در نسخه 10.14، این استثنا صرفاً به این صورت بود که مقدار maxval حداقل ۲ باشد، و در زمانی بین نسخه‌های 10.18 و 10.26 (ژانویه ۲۰۰۵)، به مقدار دقیق ۲ تغییر یافت).

اگر نتیجه یک محاسبه خارج از بازه [0, 1) قرار گیرد، pamarith آن را برش می‌زند (clip می‌کند) -- یعنی آن را برابر با صفر یا -1 در نظر می‌گیرد.

در بسیاری از موارد، زمانی که مقادیر maxval هر دو ورودی یکسان باشند، می‌توانید عملیات را صرفاً به عنوان عملیاتی میان خود مقادیر نمونه‌ها به طور مستقیم در نظر بگیرید، بدون نیاز به لحاظ کردن maxval مگر در هنگام برش خوردن (clipping). برای نمونه، یک عمل -add روی مقدار نمونه ۵ و مقدار نمونه ۸، مقدار نمونه ۱۳ را نتیجه می‌دهد.

اما در مورد -multiply، این شیوه کارایی ندارد. فرض کنید هر دو تصویر ورودی شما دارای maxval برابر با ۲۵۵ باشند، که به این معناست که تصویر خروجی نیز maxval برابر با ۲۵۵ خواهد داشت. موقعیتی از تصویر را فرض کنید که در آن مقادیر نمونه‌های ورودی ۵ و ۱۰ هستند. شاید گمان کنید حاصل‌ضرب این دو در خروجی مقدار ۵۰ را تولید می‌کند، اما pamarith محاسبات حسابی را روی کسرهای 5/255 و 10/255 اعمال می‌کند. این دو کسر را در یکدیگر ضرب کرده و سپس مقیاس را به مقدار maxval خروجی بازمی‌گرداند؛ این امر در PAM خروجی مقداری برابر با 50/255 تولید می‌کند که با گرد شدن به نزدیک‌ترین عدد صحیح، به مقدار 0 می‌انجامد.

در عملیات مربوط به رشته‌های بیتی (bit string)، مقدار maxval مفهومی کاملاً متفاوت دارد. این عملیات عبارتند از: -and، -or، -nand، -nor، -xor، و -shiftleft، -shiftright.

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

برای عملیات شیفت بیتی، مقدار maxval خروجی مشابه maxval ورودی سمت چپ خواهد بود. تصویر ورودی سمت راست (که حاوی تعداد دفعات شیفت است) می‌تواند هر مقداری برای maxval داشته باشد و این مقدار تاثیری در تفسیر نمونه‌ها نخواهد داشت. مقدار نمونه بیانگر تعداد واقعی شیفت‌ها است، با این حال همچنان لازم است که هیچ مقدار نمونه‌ای از مقدار maxval تجاوز نکند.

برنامهٔ pamarith تنها توابع دوگانی (binary) را اعمال می‌کند. اگر می‌خواهید یک تابع یکانی (unary)، مانند «نصف کردن» را روی یک تصویر منفرد اعمال کنید، از pamfunc استفاده نمایید.

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

این گزینه‌ها تابعی را که pamarith اعمال می‌کند انتخاب می‌نمایند.

شما باید دقیقاً یکی از این گزینه‌ها را مشخص کنید و نمی‌توانید بیش از یکی را تعیین نمایید.

دو مقدار را با هم جمع می‌کند. اگر نتیجه از maxval بزرگ‌تر شود، محدود (clipped) می‌شود.
مقدار موجود در تصویر ورودی سمت راست را از مقدار موجود در تصویر ورودی سمت چپ تفریق می‌کند.
مقدار کوچک‌تر از میان آن دو را انتخاب می‌کند.
مقدار بزرگ‌تر از میان آن دو را انتخاب می‌کند.
قدر مطلق تفاضل را محاسبه می‌کند.
یک ضرب حسابی معمولی انجام می‌دهد، اما به دلیل نحوه تفسیر مقادیر نمونه توسط pamarith، تمایل به تولید نتایج غیرمنتظره دارد. ببینید Maxval .
مقدار موجود در تصویر ورودی سمت چپ را بر مقدار تصویر ورودی سمت راست تقسیم می‌کند. اما همانند -multiply، تمایل به ایجاد نتایج غیرمنتظره دارد. توجه داشته باشید که رفتار محدودسازی (clipping) در pamarith باعث می‌شود در صورتی که آرگومان سمت چپ (مقسوم) از آرگومان سمت راست (مقسوم‌علیه) بزرگ‌تر باشد، این عمل کاربرد چندانی نداشته باشد -- نتیجه در این حالت همواره maxval است. اگر مقسوم‌علیه ۰ باشد، نتیجه maxval خواهد بود.

گزینهٔ -divide در Netpbm 10.30 (اکتبر ۲۰۰۵) اضافه شد.

اگر مقادیر در دو تصویر برابر باشند، مقدار maxval و در غیر این صورت مقدار صفر را تولید می‌کند. توجه داشته باشید که maxval خروجی برای -equal همواره ۱ است.

اگر maxvalهای تصاویر ورودی یکسان نباشند، ممکن است pamarith به دلیل دقت محاسبات ریاضی، ادعا کند دو مقدار با هم برابر نیستند، در حالی که در واقعیت برابرند.

می‌توانید با استفاده از گزینهٔ -closeness آزمون برابری را تقریبی کنید. این گزینه درصدی از maxval را مشخص می‌کند که نمونه‌ها می‌توانند در محدودهٔ آن تفاوت داشته باشند و همچنان برابر در نظر گرفته شوند.

گزینهٔ -equal در Netpbm 10.93 (دسامبر ۲۰۲۰) اضافه شد.

اگر مقدار در تصویر ورودی سمت چپ کمتر از مقدار در تصویر ورودی سمت راست باشد مقدار 0، اگر مقادیر برابر باشند مقدار 1، و اگر سمت چپ بزرگ‌تر از سمت راست باشد مقدار 2 را تولید می‌کند.

اگر maxvalهای تصاویر ورودی یکسان نباشند، ممکن است pamarith به دلیل دقت محاسبات ریاضی‌اش، اعلام کند دو مقدار برابر نیستند در حالی که در واقع برابرند. با این حال، هرگز اگر A از B کمتر باشد، نخواهد گفت که A از B بزرگ‌تر است.

گزینهٔ -compare در Netpbm 10.13 (دسامبر ۲۰۰۲) اضافه شد.

این گزینه‌ها تصاویر ورودی و خروجی را به عنوان رشته‌های بیتی در نظر می‌گیرند؛ و عملیات منطقی بیتی را محاسبه می‌کنند. توجه داشته باشید که اگر maxval برابر با ۱ باشد، می‌توانید به این موارد به عنوان عملیات منطقی بر روی مقادیر بولی ورودی نیز نگاه کنید. برای معنای ویژهٔ maxval در ارتباط با عملیات رشته‌های بیتی مانند این‌ها، به بخش Maxval مراجعه فرمایید.
این گزینه‌ها تصویر ورودی سمت چپ و تصویر خروجی را حاوی رشته‌های بیتی در نظر می‌گیرند. آن‌ها یک عملیات شیفت بیتی را محاسبه می‌کنند که در آن بیت‌ها از لبه چپ یا راست بیرون می‌افتند و صفرها به داخل شیفت داده می‌شوند، بر خلاف این که بیت‌ها از یک انتها به انتهای دیگر منتقل شوند. مقدار نمونه در تصویر ورودی سمت راست، تعداد موقعیت‌های بیتی برای شیفت دادن است.

توجه داشته باشید که maxval (ببینید Maxval ) پهنای قالبی را که شیفت درون آن انجام می‌گیرد مشخص می‌کند.

این گزینه معنای -equal را تغییر می‌دهد. با هیچ تابع دیگری معتبر نیست. به توضیحات مربوط به -equal مراجعه کنید.

pamfunc(1), pamsummcol(1), pamsumm(1), pnminvert(1), pambrighten(1), ppmdim(1), pnmconvol(1), pamdepth(1), pnmpsnr(1), pnm(1), pam(1)

برنامهٔ pamarith در نگارش 10.3 نرم‌افزار Netpbm (ژوئن ۲۰۰۲) جایگزین pnmarith شد.

با این حال، در Netpbm از نگارش 10.3 تا 10.8، برنامهٔ pamarith با نسخه‌های پیشین سازگار نبود، زیرا نیازمند این بود که تصاویر ورودی عمق یکسانی داشته باشند؛ بنابراین نمی‌توانستید یک تصویر PBM را در یک تصویر PPM ضرب کنید (کاری که معمولاً برای ماسک‌گذاری انجام می‌شود). (در آن زمان قصد بر این نبود که pnmarith از Netpbm حذف شود -- برنامه صرفاً بازنویسی آن برای استفاده از pamarith بود؛ اما به اشتباه حذف شد).

اما با شروع از Netpbm 10.9 (سپتامبر ۲۰۰۲)، pamarith به تصاویر اجازه می‌دهد تا زمانی که یکی از آن‌ها عمق ۱ دارد، عمق‌های متفاوتی داشته باشند، و این امر باعث سازگاری عقبرو با pnmarith گردید.

ابزار اصلی pnmarith گزینهٔ -mean را نداشت.

گزینهٔ -compare در Netpbm 10.13 (دسامبر ۲۰۰۲) اضافه شد.

عملیات رشتهٔ بیتی در Netpbm 10.27 (مارس ۲۰۰۵) اضافه شدند.

گزینهٔ -divide در Netpbm 10.30 (اکتبر ۲۰۰۵) اضافه شد.

قابلیت داشتن بیش از یک ورودی (عملوند) در Netpbm 10.93 (دسامبر ۲۰۲۰) اضافه شد.

گزینهٔ -equal در Netpbm 10.93 (دسامبر ۲۰۲۰) اضافه شد.

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

http://netpbm.sourceforge.net/doc/pamarith.html
24 October 2020 netpbm documentation