Pamscale User Manual(0) Pamscale User Manual(0)

pamscale - تغییر مقیاس یک تصویر Netpbm

pamscale
   [ 
      scale_factor 
      |
      {-xyfit | -xyfill | -xysize}
        cols rows 
      |
      -reduce reduction_factor 
      |
      [-xsize=cols | -width=cols | -xscale=factor]
      [-ysize=rows | -height=rows | -yscale=factor]
      |
      -pixels n
   ]
   [
      -nomix 
      |
      -filter=functionName [-window=functionName]
   ]
   [-linear]
   [-reportonly]
   [-verbose]
   [pnmfile]

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

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

دستور pamscale مقیاس یک تصویر Netpbm را بر اساس ضریبی مشخص تغییر می‌دهد، یا ابعاد افقی و عمودی آن را به صورت جداگانه بر اساس ضرایب تعیین‌شده تغییر مقیاس می‌دهد.

شما می‌توانید تصویر را بزرگ‌نمایی (ضریب مقیاس > ۱) یا کوچک‌نمایی (ضریب مقیاس < ۱) کنید.

دستور pamscale روی جریان‌های چند تصویری (multi-image streams) کار کرده و هر یک را به طور مستقل مقیاس‌بندی می‌کند. اما پیش از نسخه Netpbm 10.49 (دسامبر ۲۰۰۹)، این ابزار تنها اولین تصویر را مقیاس‌بندی می‌کرد و از بقیه تصاویر جریان چشم‌پوشی می‌نمود.

گزینه‌های -width، -height، -xsize، -ysize، -xscale، -yscale، -xyfit، -xyfill، -reduce، و -pixels میزان مقیاس‌بندی را کنترل می‌کنند. برای سازگاری با نسخه‌های پیشین، گزینه -xysize و آرگومان scale_factor نیز در دسترس هستند، اما نباید از آن‌ها استفاده کنید.

گزینه‌های -width و -height عرض و ارتفاع تصویر حاصل را بر حسب پیکسل مشخص می‌کنند. برای قوانینی که هنگام تعیین یکی و رها کردن دیگری اعمال می‌شوند، بخش زیر را ببینید.

گزینه‌های -xsize و -ysize به ترتیب مترادف‌های -width و -height هستند.

گزینه‌های -xscale و -yscale ضریبی را مشخص می‌کنند که می‌خواهید عرض و ارتفاع تصویر از مبدأ به نتیجه تغییر یابد (برای مثال، -xscale 2 به معنای دو برابر کردن عرض است؛ -xscale .5 به معنای نصف کردن آن است). برای قوانینی که هنگام تعیین یکی و رها کردن دیگری اعمال می‌شوند، بخش زیر را ببینید.

هنگامی که یک اندازه مطلق یا ضریب مقیاس را برای هر دو بعد مشخص می‌کنید، pamscale هر بعد را به طور مستقل و بدون در نظر گرفتن نسبت ابعاد (aspect ratio) مقیاس‌بندی می‌کند.

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

اگر یک بعد را به عنوان ضریب مقیاس مشخص کنید و بعد دیگر را تعیین نکنید، pamscale بعد نامشخص را بدون تغییر نسبت به ورودی رها می‌کند.

اگر به جای گزینه‌های ابعاد از پارامتر scale_factor استفاده کنید، آن مقدار به عنوان ضریب مقیاس برای هر دو بعد در نظر گرفته می‌شود. این حالت معادل است با: -xscale=scale_factor -yscale=scale_factor.

مشخص کردن گزینه -reduce reduction_factor معادل تعیین پارامتر scale_factor است، به طوری که scale_factor معکوسِ reduction_factor خواهد بود.

گزینه -xyfit یک کادر محصورکننده (bounding box) را مشخص می‌کند. pamscale تصویر ورودی را به بزرگ‌ترین اندازه‌ای که درون کادر جا بگیرد مقیاس‌بندی می‌کند، در حالی که نسبت ابعاد آن حفظ می‌شود. -xysize مترادفی برای این گزینه است. پیش از Netpbm 10.20 (ژانویه ۲۰۰۴)، گزینه -xyfit وجود نداشت، اما -xysize موجود بود.

گزینه -xyfill عملکردی مشابه دارد، اما pamscale تصویر ورودی را به کوچک‌ترین اندازه‌ای که کادر را به طور کامل پر کند مقیاس‌بندی می‌کند، در حالی که نسبت ابعاد آن را حفظ می‌نماید. این گزینه از Netpbm 10.20 (ژانویه ۲۰۰۴) اضافه شده است.

گزینه -pixels حداکثر تعداد کل پیکسل‌های خروجی را مشخص می‌کند. pamscale اندازه تصویر را تا آن تعداد پیکسل کاهش می‌دهد. اگر تصویر ورودی در حال حاضر بیشتر از این تعداد پیکسل نداشته باشد، pamscale صرفاً آن را در خروجی کپی می‌کند؛ pamscale با گزینه -pixels بزرگ‌نمایی انجام نمی‌دهد.

اگر تصویر را با ضریب ۳ یا بیشتر بزرگ‌نمایی می‌کنید، بهتر است مرحله‌ای با pnmsmooth اضافه کنید؛ در غیر این صورت، پیکسل‌های اصلی در تصویر حاصل دیده خواهند شد.

-reportonly

گزینه -reportonly باعث می‌شود pamscale تصویر را مقیاس‌بندی نکند، بلکه در عوض مقیاسی را که گزینه‌ها و ابعاد تصویر ورودی تعیین می‌کنند در خروجی استاندارد گزارش دهد. برای مثال، اگر مشخص کنید:

    -xyfill 100 100 -reportonly 
و ابعاد تصویر ورودی ۵۰۰ در ۴۰۰ باشد، pamscale اعلام می‌کند که این به معنای مقیاس‌بندی با ضریب ۰٫۲۵ برای رسیدن به یک تصویر ۱۲۵ در ۱۰۰ است.

می‌توانید از این اطلاعات در برنامه‌های دیگری مانند pamscalefixed استفاده کنید که فاقد قابلیت‌های غنی pamscale برای انتخاب ضرایب مقیاس هستند.

خروجی به گونه‌ای طراحی شده است که پردازش ماشینی آن آسان باشد. در مثال بالا، خروجی به شکل زیر خواهد بود:

<span style="font-family: monospace">
    500 400 0.250000 0.250000 125 100
</span>

خروجی شامل یک خط متن به ازای هر تصویر ورودی است، با نشانه‌هایی که با فاصله خالی از هم جدا شده‌اند به شرح زیر:

  • عرض ورودی بر حسب پیکسل، عدد صحیح ده‌دهی بدون علامت
  • ارتفاع ورودی بر حسب پیکسل، عدد صحیح ده‌دهی بدون علامت
  • ضریب مقیاس افقی، عدد اعشاری ممیز شناور، بدون علامت
  • ضریب مقیاس عمودی، عدد اعشاری ممیز شناور، بدون علامت
  • عرض خروجی بر حسب پیکسل، عدد صحیح ده‌دهی بدون علامت
  • ارتفاع خروجی بر حسب پیکسل، عدد صحیح ده‌دهی بدون علامت

گزینه -reportonly در Netpbm 10.86 (مارس ۲۰۱۹) اضافه شد.

یک کاربرد مفید pamscale برای محو کردن (blur) تصویر است. مقیاس آن را به پایین کاهش دهید (بدون -nomix) تا مقداری از اطلاعات دور ریخته شود، سپس با استفاده از pamstretch دوباره مقیاس آن را افزایش دهید.

یا مقیاس آن را با pamscale به بالا بازگردانید و تصویری «پیکسلی‌شده» ایجاد کنید، که به‌نوعی نسخهٔ عصر رایانه‌ای از محو کردن است.

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

ترکیب درست به این معنا نیست که صرفاً مقدار شفافیت و مقادیر مؤلفه‌های رنگ به طور جداگانه با هم مخلوط شوند. در یک تصویر PAM، پیکسلی که کدر نیست نمایانگر رنگی است که شامل نور رنگ پیش‌زمینه (که صریحاً در PAM مشخص شده) و نور رنگ پس‌زمینه (که بعداً مشخص می‌شود) است. اما مقیاس عددی نمونهٔ مؤلفهٔ رنگ در یک PAM به‌گونه‌ای است که گویی پیکسل کاملاً کدر است. بنابراین پیکسلی که قرار است حاوی نور قرمز با شدت نصف برای پیش‌زمینه به علاوه مقداری نور از پس‌زمینه باشد، دارای یک نمونهٔ رنگ قرمز است که می‌گوید قرمز کامل (full) و یک نمونهٔ شفافیت که می‌گوید ۵۰٪ کدر است. برای ترکیب پیکسل‌ها، ابتدا باید مقادیر نمونه‌های رنگ را به اعدادی تبدیل کنید که مستقیماً میزان نور را نشان می‌دهند (یعنی در میزان کدر بودن ضرب شوند) و پس از ترکیب، به حالت اول بازگردانید (تقسیم بر میزان کدر بودن).

دستور pamscale خروجی از همان نوع ورودی (و در صورت PAM بودن نوع، با همان نوع تاپل یا tuple type) تولید می‌کند، مگر اینکه ورودی PBM باشد. در این حالت، خروجی PGM با مقدار maxval برابر ۲۵۵ است. هدف از این کار، ممکن ساختن ترکیب معنادار پیکسل‌ها است. توجه داشته باشید که استثنای مشابهی در هنگام PAM بودن ورودی وجود ندارد. اگر نوع تاپل ورودی PAM برابر BLACKANDWHITE باشد، نوع تاپل خروجی PAM نیز BLACKANDWHITE خواهد بود و هیچ ترکیب معناداری از پیکسل‌ها به دست نمی‌آید.

اگر خروجی PBM را همراه با ورودی PBM می‌خواهید، از pamditherbw برای تبدیل خروجی pamscale به PBM استفاده کنید. همچنین برنامهٔ pbmreduce را مد نظر داشته باشید.

عملکرد pamscale اساساً برای تصاویر ورودی PAM که نوع تاپل آن‌ها RGB، GRAYSCALE، BLACKANDWHITE یا نسخه‌های _ALPHA آن‌ها نیست، تعریف‌نشده است. (بر اساس سازگاری عقبروی استاندارد Netpbm، این شامل تصاویر PBM، PGM و PPM نیز می‌شود).

ممکن است فکر کنید این دستور اثر مشخصی روی سایر انواع تاپل دارد، اما به یاد داشته باشید که انواع تاپل پیش‌گفته دارای مقادیر نمونهٔ تنظیم‌شده با گاما (gamma-adjusted) هستند و pamscale از این واقعیت در محاسبات خود استفاده می‌کند. همچنین با صفحهٔ شفافیت (transparency plane) متفاوتی نسبت به سایر صفحه‌ها رفتار می‌کند.

دستور pamscale انواع تاپل ناشناخته را صرفاً رد نمی‌کند زیرا این احتمال وجود دارد که تصادفاً با نوع تاپل دیگری و ترکیب مناسبی از گزینه‌ها (به‌ویژه -linear را در نظر بگیرید) بتوانید کارکرد مفیدی از آن به دست آورید.

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

ترکیب پیکسل‌ها (Pixel Mixing)

روش پیش‌فرض pamscale ترکیب پیکسل‌ها است. برای درک این موضوع، تصویر مبدا را متشکل از کاشی‌های مربعی تصور کنید. هر کاشی یک پیکسل است و رنگ یکنواختی دارد. همهٔ کاشی‌ها هم‌اندازه هستند. اکنون یک صفحهٔ شفاف به اندازهٔ تصویر مقصد در نظر بگیرید که با یک شبکهٔ مربعی از کاشی‌های هم‌اندازه علامت‌گذاری شده است. تصویر مبدا را به اندازهٔ صفحه بکشید یا فشرده کنید و صفحه را روی تصویر مبدا قرار دهید.

هر خانه در شبکهٔ رویی نشان‌دهندهٔ یک پیکسل از تصویر مقصد است. برای مثال، اگر در حال افزایش مقیاس یک تصویر 100x200 با ضریب 1.5 باشید، تصویر مبدا ۱۰۰ در ۲۰۰ کاشی است و صفحهٔ شفاف به ۱۵۰ در ۳۰۰ خانه تقسیم‌بندی شده است.

هر خانه بخش‌هایی از چندین کاشی را می‌پوشاند. برای ساخت تصویر مقصد، کافی است درون هر خانه را با رنگی پر کنید که میانگین رنگ‌های پوشانده‌شده توسط آن خانه است - با وزن‌دهی بر اساس مقداری از آن رنگ که پوشانده است. در مثال ما، یک خانه ممکن است ۴/۹ از یک کاشی آبی، ۲/۹ از یک کاشی قرمز، ۲/۹ از یک کاشی سبز و ۱/۹ از یک کاشی سفید را بپوشاند. بنابراین، پیکسل مقصد یک رنگ آبی تا حدی غیراشباع خواهد بود.

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

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

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

نمونه‌برداری گسسته (Discrete Sampling)

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

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

مزیت این روش این است که در پایان تصویری با همان پالت رنگ تصویر اصلی خواهید داشت. گاهی اوقات این موضوع اهمیت دارد.

عیب آن، ایجاد اعوجاج در تصویر است. برای مثال، اگر مقیاس افقی را با ضریب 1.5 افزایش دهید، پیکسل‌های ورودی با شمارهٔ زوج در خروجی دو برابر می‌شوند و پیکسل‌های فرد به‌صورت تکی کپی می‌شوند. اگر مجموعه‌ای از خطوط با ضخامت یک پیکسل در مبدا داشته باشید، ممکن است متوجه شوید هنگام بزرگ‌نمایی برخی از آن‌ها به ۲ پیکسل افزایش یافته و برخی دیگر ۱ پیکسل باقی می‌مانند. هنگام کوچک‌نمایی نیز ممکن است ببینید که برخی از خطوط کاملاً ناپدید می‌شوند.

شما نمونه‌برداری گسسته را با گزینهٔ -nomix در pamscale انتخاب می‌کنید.

در واقع، گزینهٔ -nomix دقیقاً آنچه در بالا شرح داده شد را انجام نمی‌دهد. این گزینه تغییر مقیاس را در دو مرحله انجام می‌دهد - ابتدا افقی، سپس عمودی. این کار می‌تواند نتایج کمی متفاوتی ایجاد کند.

یک حالت رایج وجود دارد که در آن تولید رنگ‌هایی که در ابتدا وجود نداشتند توسط pamscale ناخوشایند است: زمانی که با یک قالب تصویری مانند GIF کار می‌کنید که تعداد رنگ‌های ممکن در هر تصویر آن محدود است. اگر یک تصویر GIF با ۲۵۶ رنگ را بردارید، آن را به PPM تبدیل کنید، مقیاس را با ضریب .625 تغییر دهید و دوباره به GIF تبدیل کنید، احتمالاً متوجه خواهید شد که تصویر کوچک‌شده بسیار بیشتر از ۲۵۶ رنگ دارد و بنابراین نمی‌تواند به GIF تبدیل شود. یک راه برای حل این مشکل، انجام کاهش مقیاس با نمونه‌برداری گسسته به‌جای ترکیب پیکسل‌ها است. احتمالاً روش بهتر این است که ترکیب پیکسل‌ها را انجام دهید، اما سپس رنگ‌های نتیجه را قبل از تبدیل به GIF با pnmquant کوانتایز کنید.

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

نمونه‌برداری گسسته در pamscale سریع‌تر از ترکیب پیکسل‌ها است، اما pamenlarge حتی سریع‌تر است. برنامهٔ pamenlarge فقط روی بزرگ‌نمایی‌های با ضریب عدد صحیح کار می‌کند.

نمونه‌برداری گسسته (-nomix) از Netpbm 9.24 (ژانویهٔ ۲۰۰۲) اضافه شد.

نمونه‌برداری مجدد (Resampling)

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

ایدهٔ نمونه‌برداری مجدد این است که آن تصویر اصلی محاسبه شود، سپس با بسامدی متفاوت (یک شبکه با مقیاسی متفاوت) از آن نمونه‌برداری شود.

البته مشکل اینجاست که نمونه‌برداری لزوماً اطلاعات مورد نیاز شما برای بازسازی تصویر اصلی را دور می‌ریزد. بنابراین ما مجبوریم فرضیاتی را دربارهٔ ساختار تصویر اصلی در نظر بگیریم.

شما با مشخص کردن گزینهٔ -filter به pamscale می‌گویید که از روش نمونه‌برداری مجدد استفاده کند. مقدار این گزینه نام یک تابع از میان مجموعهٔ فهرست‌شده در زیر است..PP برای توضیح نمونه‌برداری مجدد (resampling)، درباره یک مقیاس‌بندی یک‌بعدی ساده صحبت خواهیم کرد -- مقیاس‌بندی افقی یک سطر منفرد از پیکسل‌های خاکستری (grayscale). اگر این را درک کنید، به‌راحتی می‌توانید چگونگی انجام آن را برای کل یک تصویر بفهمید: هر یک از سطرهای تصویر را مقیاس‌بندی کنید، سپس هر یک از ستون‌های حاصل را مقیاس‌بندی نمایید؛ و هر یک از صفحه‌های مؤلفه رنگ را نیز جداگانه مقیاس‌بندی کنید.

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

اکنون، تابع پله‌ای را با یک مقیاس مناسب از تابع پالایه (filter function) که با -filter مشخص کرده‌اید کانولوشن یا پیچش (convolve) می‌دهیم. اگر مفهوم ریاضی کانولوشن را نمی‌دانید، رسماً سردرگم خواهید شد و نمی‌توانید این توضیح را درک کنید. نتیجه این کانولوشن، همان تصویر پیوسته اصلیِ فرضی است که درباره‌اش صحبت می‌کردیم.

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

برای درک آنچه رخ می‌دهد، از تحلیل فوریه استفاده می‌کنیم:

ایده این است که تنها تفاوت میان تابع پله‌ای ما و تابع پیوسته اصلی (به یاد داشته باشید که ما تابع پله‌ای را از روی تصویر مبدأ ساختیم، که خود نمونه‌برداری از تابع پیوسته اصلی است) این است که تابع پله‌ای دسته‌ای از مؤلفه‌های فرکانس بالای فوریه را به همراه دارد. اگر بتوانیم همه مؤلفه‌های فرکانس بالاترِ تابع پله‌ای را حذف کنیم، و بدانیم که همه آن‌ها فرکانسی بالاتر از هر فرکانسی در تابع اصلی دارند، تابع اصلی را دوباره به دست خواهیم آورد.

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

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

می‌توانستیم تبدیل فوریه تابع پله‌ای را بیابیم، آن را در یک تابع مستطیلی ضرب کنیم و سپس از نتیجه تبدیل معکوس فوریه بگیریم، اما راه ساده‌تری وجود دارد. ریاضیدانان می‌گویند ضرب در حوزه فرکانس معادل کانولوشن در حوزه زمان است. این بدان معناست که ضرب تبدیل فوریه F در یک تابع مستطیلی R معادل کانولوشن F با تبدیل فوریه R است. بسیار بهتر است که تبدیل فوریه R محاسبه شده و درون ساختار pamscale گنجانده شود، تا اینکه pamscale تبدیل فوریه تصویر ورودی را به‌صورت پویا محاسبه کند.

این فقط یک پرسش باقی می‌گذارد: تبدیل فوریه یک تابع مستطیلی واقعاً چیست؟ پاسخ: sinc. از ریاضیات به یاد بیاورید که sinc به‌صورت sinc(x) = sin(PI*x)/PI*x تعریف می‌شود.

از این رو، هنگامی که -filter=sinc را مشخص می‌کنید، در عمل تابع پله‌ای تصویر مبدأ را از یک پالایه فرکانسی پایین‌گذر عبور می‌دهید و تقریب مناسبی از تصویر پیوسته اصلی را بازیابی می‌نمایید.

پالایش مجدد (Refiltering)

نکته ظریف دیگری نیز وجود دارد: اگر تصویر پیوسته اصلیِ بازسازی‌شده را صرفاً با نرخ نمونه‌برداری جدید نمونه‌برداری کنید، و این نرخ جدید حداقل دو برابر بالاترین فرکانس در تصویر پیوسته اصلی نباشد، نمونه‌برداری بی‌نقصی نخواهید داشت. در واقع، خروجی چیزی همراه با پدیده نامطلوب پله‌ای شدن (aliasing) خواهد بود. توجه داشته باشید که این مسئله هنگام بزرگ‌نمایی (scaling up یا افزایش نرخ نمونه‌برداری) رخ نمی‌دهد، زیرا بالاتر بودن نرخ نمونه‌برداری پیشین از سطح نایکویست به این معنی است که نرخ جدید نیز بالاتر خواهد بود. اما هنگام کوچک‌نمایی (scaling down)، این یک مشکل است. بدیهی است که هنگام کوچک‌نمایی باید مقداری از کیفیت تصویر را فدا کنید، اما بروز aliasing بهترین راه برای انجام آن نیست. بهتر است پیش از نمونه‌برداری، مؤلفه‌های فرکانس بالا را از تصویر پیوسته اصلی حذف کنید، و سپس از آن نمونه‌برداری بی‌نقصی انجام دهید.

بنابراین، pamscale پیش از انتخاب نمونه‌های جدید، فرکانس‌های بالاتر از نصف نرخ نمونه‌برداری جدید را فیلتر و حذف می‌کند.

تقریب‌ها (Approximations)

متأسفانه، pamscale کانولوشن را به‌طور دقیق انجام نمی‌دهد. به‌جای ارزیابی تابع پالایه در هر نقطه، آن را نمونه‌برداری می‌کند -- فرض می‌کند که تغییرات آن بیشتر از تغییرات تابع پله‌ای رخ نمی‌دهد. pamscale در واقع می‌توانست انتگرال‌گیری واقعی را نسبتاً آسان انجام دهد. از آنجا که توابع پالایه در برنامه تعبیه شده‌اند، انتگرال‌های آن‌ها نیز می‌توانست در برنامه گنجانده شود. شاید روزی چنین شود.

پیچیدگی دیگری نیز در تحلیل فوریه وجود دارد. sinc تا بی‌نهایت و منفی بی‌نهایت دارای مقادیر غیرصفر است. این امر محاسبه کانولوشن با آن را دشوار می‌سازد. بنابراین در عوض، توابع پالایه‌ای وجود دارند که sinc را تقریب می‌زنند اما تنها در یک بازه مهارپذیر غیرصفر هستند. برای دسترسی به آن‌ها، تابع sinc را در یک تابع پنجره (window function) ضرب می‌کنید که آن را با گزینه -window تعیین می‌نمایید. همین موضوع برای دیگر توابع پالایه که مانند sinc تا بی‌نهایت ادامه دارند نیز صدق می‌کند. به‌طور پیش‌فرض، برای پالایه‌ای که به تابع پنجره نیاز دارد، تابع پنجره همان تابع Blackman است. توابع Hanning، Hamming و Kaiser گزینه‌های جایگزین هستند.

توابع پالایه به‌جز Sinc (Filter Functions Besides Sinc)

ریاضیات شرح داده شده در بالا تنها با sinc به‌عنوان تابع پالایه کار می‌کند. با این حال، pamscale توابع پالایه بسیار دیگری نیز ارائه می‌دهد. برخی از این‌ها sinc را تقریب می‌زنند و سرعت محاسباتی بالاتری دارند. برای بیشتر آن‌ها، توضیح ریاضی مشخصی سراغ ندارم، اما کاربران متوجه شده‌اند که این توابع نتایج خوشایندی تولید می‌کنند. ممکن است این توابع اصلاً بر پایه نمونه‌برداری مجدد نباشند، بلکه صرفاً از کانولوشنی که تصادفاً بخشی از محاسبات نمونه‌برداری مجدد است بهره‌برداری کنند.

برای برخی از توابع پالایه، می‌توانید صرفاً با نگاه کردن به کانولوشن تشخیص دهید که چگونه فرایند نمونه‌برداری مجدد را نسبت به روش بی‌نقص مبتنی بر sinc تغییر می‌دهند:

پالایه ضربه (impulse filter) فرض می‌کند که تصویر پیوسته اصلی در حقیقت یک تابع پله‌ای است -- دقیقاً همان تابعی که در گام اول نمونه‌برداری مجدد محاسبه کردیم. این موضوع از نظر ریاضی معادل روش نمونه‌برداری گسسته است.

پالایه جعبه‌ای (مستطیلی یا box filter) فرض می‌کند تصویر اصلی یک تابع خطی تکه‌ای (piecewise linear) است. نمودار آن شبیه خطوط راستی است که مقادیر پیکسلی را به هم متصل می‌کنند. این حالت از نظر ریاضی معادل روش آمیختن پیکسل‌ها (pixel mixing) هنگام کوچک‌نمایی (البته آمیختن روشنایی، نه شدت نور؛ یعنی مشابه pamscale -linear) و درون‌یابی (interpolation، مانند pamstretch) هنگام بزرگ‌نمایی است.

گاما (Gamma)

دستور pamscale فرض می‌کند تابع پیوسته زیرین، تابعی از روشنایی (در مقایسه با شدت نور) است، و بنابراین تمامی این محاسبات ریاضی را با استفاده از مقادیر تنظیم‌شده با گاما که در یک تصویر PNM یا PAM وجود دارد انجام می‌دهد. گزینه -linear همراه با نمونه‌برداری مجدد در دسترس نیست (موجب شکست اجرای pamscale می‌شود)، زیرا آن‌قدر مفید نبوده که زحمت پیاده‌سازی را توجیه کند.

قابلیت نمونه‌برداری مجدد (-filter) در Netpbm نسخه 10.20 (ژانویه ۲۰۰۴) جدید بود.

توابع پالایه و پنجره (The filter and window functions)

در اینجا فهرستی از نام توابعی که می‌توانید برای گزینه‌های -filter یا -window مشخص کنید آورده شده است. برای بیشتر آن‌ها، کشف اینکه تابع دقیقاً چیست و چه نوع مقیاس‌بندی انجام می‌دهد بر عهده خودتان است. این‌ها توابع رایجی در ریاضیات هستند. توجه داشته باشید که برخی از این‌ها تنها به‌عنوان توابع پالایه و برخی دیگر تنها به‌عنوان توابع پنجره کاربرد دارند.

نمودار این تابع یک نقطه منفرد در X=0 و Y=1 است.
نمودار این تابع یک مستطیل قرار گرفته روی محور X و با مرکزیت محور Y است که دارای ارتفاع ۱ و قاعده ۱ می‌باشد.
نمودار این تابع یک مثلث متساوی‌الساقین واقع بر محور X و با مرکزیت محور Y است که دارای ارتفاع ۱ و قاعده ۲ می‌باشد.
hamming
مستند نشده است

روش مقیاس‌بندی ترکیب پیکسل که در بالا شرح داده شد، با شدت روشنایی پیکسل‌ها سر و کار دارد (به طور دقیق‌تر، شامل شدت روشنایی جداگانهٔ مؤلفه‌های رنگ اصلی پیکسل‌ها می‌شود). اما قالب‌های تصویر PNM و PAM معادل آن، شدت روشنایی را با اعداد تنظیم‌شده با گاما نمایش می‌دهند که به صورت خطی با شدت روشنایی متناسب نیستند. بنابراین pamscale، به طور پیش‌فرض، برای تبدیل بین این اعداد تنظیم‌شده با گاما و اعداد متناسب با شدت روشنایی داخلی، محاسباتی را روی هر نمونهٔ خوانده‌شده از ورودی و هر نمونهٔ نوشته‌شده در خروجی انجام می‌دهد.

گاهی اوقات شما با تصاویر PNM یا PAM واقعی کار نمی‌کنید، بلکه با گونه‌ای سر و کار دارید که در آن مقادیر نمونه‌ها در واقع مستقیماً با شدت روشنایی متناسب هستند. در این صورت، از گزینهٔ -linear استفاده کنید تا این موضوع را به pamscale اعلام کنید. سپس pamscale از انجام این تبدیل‌ها صرف‌نظر خواهد کرد.

این تبدیل زمان‌بر است. در یک آزمایش، زمان لازم برای کوچک کردن تصویر تا ۱۰ برابر افزایش یافت. همچنین تفاوت بین مقادیر متناسب با شدت روشنایی و مقادیر تنظیم‌شده با گاما ممکن است آن‌قدر ناچیز باشد که اگر فقط فرض کنید مقادیر تنظیم‌شده با گاما در واقع متناسب با شدت روشنایی هستند، به‌ندرت تفاوتی در نتیجه مشاهده کنید. بنابراین، تنها برای صرفه‌جویی در زمان، به بهای کاهش اندکی از کیفیت تصویر، می‌توانید گزینهٔ -linear را حتی زمانی که ورودی PPM واقعی دارید و انتظار خروجی PPM واقعی دارید، مشخص کنید.

در طول ۱۳ سال نخست انتشار Netpbm، تا نسخهٔ Netpbm 10.20 (ژانویه ۲۰۰۴)، برنامهٔ پیشین pamscale یعنی pnmscale همواره با نمونه‌های PPM طوری رفتار می‌کرد که گویی متناسب با شدت روشنایی هستند، در حالی که چنین نبودند، و شکایات کمی نیز به همراه داشت. بنابراین اگر سرعت برای شما اهمیت دارد، استفاده از -linear اقدامی منطقی است. اما اگر سرعت اولویت دارد، باید گزینهٔ -nomix و ابزار pnmscalefixed را نیز مد نظر قرار دهید.

راهکار دیگری که می‌توان در نظر گرفت، تبدیل تصویر PNM به گونهٔ خطی با استفاده از pnmgamma، اجرای pamscale و سایر تبدیلات سازگار با PNM خطی روی آن، و سپس بازگرداندن آن به PNM واقعی با دستور pnmgamma -ungamma است. ابزار pnmgamma اغلب در انجام این تبدیل سریع‌تر از pamscale عمل می‌کند.

همراه با -nomix، گزینهٔ -linear هیچ تأثیری ندارد؛ زیرا در این روش pamscale به مفهوم مقادیر نمونه‌ها کاری ندارد و صرفاً اعداد را از ورودی به خروجی رونوشت می‌کند.

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

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


این گزینه‌ها ضریب‌های مقیاس افقی و عمودی را مشخص می‌کنند.


ببینید ضریب‌های مقیاس (The Scale Factors) .


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


ببینید -reportonly .


این گزینه نمونه‌برداری گسسته (discrete sampling) را به عنوان

روش مقیاس‌بندی انتخاب می‌کند.


این گزینه نمونه‌برداری مجدد (resampling) را به عنوان

روش مقیاس‌بندی انتخاب می‌کند.


این گزینه یک تابع پنجره را برای تعدیل تابع فیلتر مشخص‌شده با -filter انتخاب می‌کند.

ببینید نمونه‌برداری مجدد (Resampling) .


این گزینه موجب می‌شود pamscale پیام‌هایی در رابطه با مقیاس‌بندی در خطای استاندارد صادر کند.

pnmscalefixed(1), pamstretch(1), pamstretch-gen(1), pamditherbw(1), pbmreduce(1), pbmpscale(1), pamenlarge(1), pnmsmooth(1), pamcut(1), pnmgamma(1), pnmscale(1), pnm(1), pam(1)

ابزار pamscale در Netpbm نسخهٔ 10.20 (ژانویه ۲۰۰۴) معرفی شد. این ابزار از pnmscale اقتباس شده و جایگزین آن گردید (آن را منسوخ کرد). تفاوت اصلی pamscale با pnmscale در این است که قالب PAM را مدیریت می‌کند و از امکانات «pam» در کتابخانهٔ برنامه‌نویسی Netpbm بهره می‌گیرد. اما این برنامه ردهٔ روش‌های مقیاس‌بندی بازنمونه‌برداری (resampling) را نیز اضافه کرد. علاوه بر این، محاسبات ترکیب پیکسل‌ها را به‌درستی (به‌طور پیش‌فرض) با استفاده از مقادیر متناسب با شدت روشنایی به جای مقادیر تنظیم‌شده با گاما که pnmscale به کار می‌برد، انجام می‌دهد. برای استفاده از روش محاسباتی قدیمی pnmscale، می‌توانید گزینهٔ -linear را مشخص کنید.

محاسبات متناسب با شدت روشنایی، حاصل پیشنهادهای Adam M Costello در ژانویه ۲۰۰۴ بود.

الگوریتم‌های بازنمونه‌برداری عمدتاً از کدهای ارائه‌شده توسط Michael Reinelt در دسامبر ۲۰۰۳ برگرفته شده‌اند.

نسخه‌ای از pnmscale که pamscale از آن مشتق شد، خود از نسخهٔ اولیهٔ Pbmplus دستور pnmscale به دست Jef Poskanzer (۱۹۸۹، ۱۹۹۱) تکامل یافته بود؛ اما هیچ‌یک از آن کدهای اولیه باقی نمانده است.

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

http://netpbm.sourceforge.net/doc/pamscale.html
29 June 2020 netpbm documentation